19790620_Z IOP_1.5_ls 19790620 Z IOP 1.5 Ls
19790620_Z-IOP_1.5_ls 19790620_Z-IOP_1.5_ls
User Manual: 19790620_Z-IOP_1.5_ls
Open the PDF directly: View PDF .
Page Count: 30
Download | |
Open PDF In Browser | View PDF |
20-Jun-79 10:23:38 Z-IOP.ls 1 2 3 4 5 6 7 8 9 10 last change: moved interrupt vectors to RAM to allow disk programs to use interrupts not used by rom This file contains the code that will be resident in the lOP rom with BOOTABlE disks--Interim arrangement Author: Bruce Horn last changed: June 18, 1979 3:19 PM 12 13 14 15 16 17 18 19 1 2 3 4 5 6 .Predefine 1000 1002 1004 1006 1008 100A 100C 100E 1010 1012 1014 1020 1022 1024 1026 1028 1030 1032 1034 1036 1038 103A 103C 103E 1040 1042 1044 1048 104A 104C 104E 1050 1052 1054 1056 1057 1058 105A 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 "8086Predefs.sr" .Get "Z-IOPRamDefs.bca" Z-IOPRamDefs.bca ;Ram locations ... This file contains the lOP Ram locations and symbols. The lOP can address ram beginning at 1000H All state is booted from the disk Author: Bruce Horn last changed: June 18, 1979 7 1000 1 BCA/l/e Z-IOP.bca;pnew z-iop.mb@P@ Current version is version 1.5 11 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Page 3: 04 PM ;RAM definitions fol1ow-- ;The following is PRIVATE to the 10 processor IOPRam= 1000 ;IOP Ram begins at this address B itsGone= Count= Mask= Offset= Templ= IRR= Portl00= Port60= Port20= KbdOffset= OldKbdData= IOPRam BitsGone+2. Count+2. Mask+2. Offset+2. Templ+2. 1RR+2. Portl00+2. Port60+2. Port20+2. KbdOffset+2. ;Kbd Handler temp ;temp ;temp ;temp {Meta keys modify this} ;Temp for interrupt routine ;1nterrupt mask (IntsOn/Off) ;portlOO settings ;Port60 settings ;port20 settings ;current byte address on input ;6 word keyboard input, old RO= Rl= R2= R3= BitE rrors= OldKbdData+12. RO+2. R1+2. R2+2. R3+2. ;various temporary registers ; for rom to use .ShowNewCursor= . DisplayOn= .DisplayOff= . WaitBug= . Wa itNoBug= .1ntsOn= . 1ntsOff= . SetP60= . 10Init= DStatus= JumpTo= NextDisk= ReTry= BeginAdr= BeginSeg= OldAdr= OldSeg= Blocks= Track= Sector= . Buffer= Buffer= BitErrors+8. ;Other useful rom routines .ShowNewCursor+2 . .DisplayOn+2. -.DisplayOff+2 . .WaitBug+2. .WaitNoBug+2. .1ntsOn+2 . .lntsOff+2 . .SetP60+2 . .IOInit+2. ;disk status on fail DStatus+2. ; Byte/Seg' add ress of in it rout i ne JumpTo+4. ;another disk after this one? NextDisk+2. ;Retry counts/sector rlw ReTry+2. ;Begin loading address BeginAdr+2. ;Begin loading segment ;last address since R/W sector BeginSeg+2. 01dAdr+2. ; Last segment OldSeg+2. ;Blocks to read Blocks+2. ;Current track Track+l. ;Current sector ;location of disk buffer Sector+l . .Buffer+2. ;128 char disk buffer ;following 8 bytes are bit errors ;from mem test 2000 2000 2002 2004 2006 2008 200A 200C 200E 2010 2012 2014 2016 2018 201A 201C 20lE 2020 2022 2024 2026 2028 202A 202B 202C 2020 202F 2031 2033 2036 2038 203A 207A 207C 2094 2000 210C 210E 211E 2120 2122 2126 2I2A 212£ 2136 2136 213E 2140 214E 215E 2160 2162 2164 2I6C 22AO 22AO 22A5 22AA 22AF 22B4 22B9 22BE 22C3 Page 20-Jun-79 10:23:38 Z-IOP.ls 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 2 ;The following is PUBLIC information--The emulator processor can ;address this information, and possibly alter i t EPRam= 2000 ;EP can address ram starting here ;Routines available in ROM · BitBlt= .SetP100= · SetP20= .InitDC= · Hi deCu rsor= .ShowCursor= · RomIn it= EPRam .BitBlt+2. .SetP100+2. .SetP20+2. · In itDC+2. · HideCursor+2. .ShowCursor+2. ;address of BitBLT routine ;address of portlOO routine ;port 20 ;display controller init ;hides, locks cursor ;unlocks, shows cursor ;initializes rom ;Other reserved locations QByte= QSeg= Qlock= ICount= OldICount= KbdStatus= MouseX= MouseY= RMX= RMY= RMW= OldMX= OldMY= KbdData= MYDelta= MXDelta= KWO= KW1= KW2= KW3= ReadPtr= WritePtr= KbdBuffer= IntKey= DC In its= CDF= ADF= NIChars= ICl ist= . Cursor= .Display= .CursorTable= .BBTable= .KbdMap= CTHeader= CursorTable= Dis play Bits = Cu rsorX= CursorY= CursorBits= Cu rsorXOff= CursorYOff= Cursorlock= BBHeader= BBTable= · RomI n it+2. QByte+2. QSeg+2. QLock+2. ICount+2. OldICount+2. KbdStatus+2. MouseX+2 MouseY+2. RMX+2. RMY+2. RMW+2. RMH+2. OldMX+2. OldMY+2. KbdDa ta+1. KbdData+2. KbdData+3. KbdData+5. KbdOata+7. KbdData+9. KbdData+12. ReadPtr+2. WritePtr+2. KbdBuffer+64. IntKey+2. DCIn i ts+24. CDF+60. ADF+60. NIChars+2. ICList+16 . .Cursor+2. .Display+2. .CursorTable+4. .BBTable+4. .KbdMap+4. CTHeader+8. CursorTabl e+O. CursorTable+8. CursorX+2 CursorTabl e+24. CursorTable+40. CursorXOff+2. CursorYOff+2. Cu rso rTab 1e+46. BBHeader+8. RamInts= 22AO IROO= IR01= IR02= IR03= IR04= IR05= IR06= IR07= RamInts IROO+5. IR01+5. IR02+5. IR03+5. IR04+5. IR05+5. IR06+5. RMH= ;TRB Queue Header ;segment of last block ;Queue locked-->negative ;60hz interrupt counter ;old interrupt count for change ;#chars in bufferlmouse buttons ;Mouse X position ;Mouse Y position Defines restricted rectangle for mouse--X. Y. Width. Heiaht Mouse cannot move outside this rectangle ;old MouseX since cursor ;Old MouseY since cursor ;Keyboard data from Kbd UART (6w) ; Mouse Y de lta ;Mouse X delta ;Keyboard word zero ;Keyboard word one ;Keyboard word two ;Keyboard word three ;Read Pointer for kbd buffer ;Write Pointer ;32 character kbd buffer ;has an interrupt key been hit? ;Display controller init table ;Current Disk Format ;Alternate Disk Format ;number of interrupt keys ;[char],[char] ... [char] <=8 ;2 byte oop ;2 byte oop of display ;2 word addr. to cursor bb table ;2 word addr. to display bb table ;2 word address to Keyboard Map ;TRB header for Cursor table ;Cursor bitblt table ;display bitmap loc in table ;Cursor X position ;Cursor Y position ;cursor bitmap loc in table ;cursor x offset ;cursor y offset ;should cursor change? ;TRB header for BB table ;Display bitblt table ; ParErrInt ;IPSysInt ;DiskInt ; EIAInt ;OddInt ;ADClnt ;Kbdlnt ;VSyncInt Z-IOP.ls 0000 0002 FFFF 0000 OOOC 0000 0002 0004 0006 0008 OOOA OOOC OOOE 0010 0012 0014 0016 0018 001A 20-Jun-79 10:23:38 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 1'\1'\11" 161 001E 0020 0022 0024 0026 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 VVJ. ... FFFC FFFB FFC7 FE3F FlFF EFFF DFFF 3FFF FCFF E3FF BFFF DFFF 7HF FHO FFEF FFOF FFBF FF7F 0000 0002 OOEF OOBF 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 20 21 1 Page 3 ;The following are some useful constants that should be listed ;as external: Cu rren-toS= XorBB= Black= Wh ite= StcBB= o 02 OFFFF o DC ;current code, data segment ;bitblt XOR ;B1ack ;White for bitb1t store constant ;Store constant ;BitBLT table offsets-BBDB= BBOS= DRast= DField= DestX= DestY= DestW= OestH= C1 ipX= C1ipY= C1ipW= C1ipH= BBSB= BBSS= SRast= SFie1d= SourceX= SourceY= Function= GrayBits= O. 2. 4. 6. 8. 10. 12. 14. 16. 18. 20. 22. 24. 26. ;BitBLT Destination Byte address ;BB Destination Segment address ;Destination raster ;Destination field size ;Destination X ;Oestination Y ;Destination Width ;Oestination Height ;C1ip X ;Clip Y ;C1ip Width ;C1ip Height ;BitBLT Source Byte address ;BitB1t Source Segment address raster 28. ;SCUfCC 30. 32. 34. 36. 38. ;Source Field size ;Source X ; Source Y ;Function ;Gray bits ;Portl00 Fields: {Disk/ADC selects} DiskPower= DiskSide= DiskDrive= ADCOevice= B itC1 k= OiskMR= GoWordClock= AOCSpeed= OFFfC OFFFB OFFC7 OFE3F OFlFF OEFFF ODFFF 03FFF ;+5=2, +12=1 ; Side ze r.olone ;01=4, 02=2, 03=1 ;Device select ;Bit clock field ;Disk Controller master reset ;StopWordClock' ;AOC sampling rate ;Port60 Fields: (DAC/Tablet selects) TabletSelect= OACSpeed= SampleHoldA= Samp1eHo1dB= SampleNotHo1d= OFCFF OE3FF OBFFF ODFFF 07FFF ;2=Tablet X, l=Tablet Y ;DAC sampling rate ;Sample/Ho1d channel A ;Sample/Ho1d channel B ;Sample/Ho1d' ;Port20 Fields: (lOP Processor selects) LEDSOn= Oisab1eRom= CharCtr= IOPLock= BootSeqDone= OFFFO OFFEF OFFOF OFFBF OFF7F ;Ports and other port fields ic= 0 ocwl= 2 OEF ir4= ir6= OBF ;Light LEOs. 1111 lights all ;Run out of main mem only ; Char counter ;IOP Processor lock ;Stop mapping mem req into Rom ;interrupt controller ;interrupt controller wordl ;defines Oddlnt field ;defines Kbdlnt field .ENO .Get "Z-Boot.bca" Z-Boot.BCA ;debugger Z-IOP.ls 20-Jun-79 10:23:38 Page 0000 0000 ; 1000 3000 2EOO mem test range fi rst past = FirstSP= 1000 3000 2EOO ;8086 Interrupt vector 0000 0000 0002 0004 0006 0008 aOOA OOOC OOOE 0010 0012 .loc 9F 00 B7 00 CF 01 00 01 00 01 . adr .adr .adr .adr .adr 00 00 .ad!" E7 01 .adr .adr . adr .adr 00 00 FF 01 00 00 a OivErr ram SST ram NMI ram BPT ram OVF ram ; interrupt vector (if sys=O) ; type 0 divide error ; type single step ;type 2 nmi ; type 3 breakpoint ; type 4 overflow ;8259 Interrupt vector 0080 .loc 4*020 0080 AO 22 .adr .adr .adr .adr .adr .adr .adr .adr .adr .adr .adr .adr .adr .adr .adr .adr 0082 00 00 0084 0086 0088 008A 008C 008E 0090 0092 0094 0096 0098 009A 009C 009E A5 00 AA 00 AF 00 B4 00 B9 00 BE 00 C3 00 22 00 22 00 22 00 22 00 22 00 22 00 22 00 IROO Ram IROl Ram IR02 Ram IR03 Ram IR04 Ram IR05 Ram IR06 Ram IR07 Ram ;ParErrInt ;IPSysInt ;Oisklnt ; EIAlnt ;Oddlnt ;ADClnt ;Kbdlnt ;VSyncInt IntVectors: OOAO 00A5 OOAA OOAF 00B4 00B9 OOBE 00C3 EA EA EA EA EA EA EA EA A7 BF 07 EF 46 07 76 07 07 07 07 07 08 07 1F 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 jmps jmps jmps jmps jmps jmps jmps jmps OFFO OFFO EA DO 00 00 00 ParErrInt Rom IPSysInt Rom OiskInt Rom EIAInt Rom Oddlnt Rom AOClnt Rom Kbdlnt Rom VSynclnt Rom .loc OFFO jmps restart rom OODO .loc 000 ;********Boot******** Restart: reset vector sets CS=FOOO(O) 4 20-Jun-19 10:23:38 Z-lOP.1s 0000 0001 0004 0006 0008 FA 88 8E 8E 8E OODA OODC OODF OOEO 00E3 BO BA EE BB EB 88 20 00 00E5 00E7 00E9 OOEB 00 04 00 16 00 01 01 01 00 00 DO 08 CO 00 00 08 OOED B9 01 00 OOFO B8 00 70 00F3 00F5 00F7 OOFA OOFC OOFE 0100 0104 0107 010A 010B 0100 0110 0113 0114 FF 75 B8 E2 FF FF C8 FC 00 70 F1 C3 C3 18 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 mov mov cX,Ul ax,U7000 dec jnz mov loop ax LP aX,U1000 LP 105 inc bx 106 inc jmpi bx Xibx mov mov outdw j aX,U2 ;+5 volts on dX,UI00 B8 02 00 BA 00 01 EF EB EO B8 03 00 108 109 110 111 112 113 114 115 SA 00 01 116 EF EB 07 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 FE FF FF 80 74 80 74 80 74 80 74 E9 C2 C7 C7 FA lC FA 17 FA 12 FA 00 39 0138 013A 013C 013E 0140 00 FF 00 AA 55 00 00 AA 55 0142 0145 0149 014B 0140 014F 0153 BE 8B 89 FF FF 81 72 00 10 90 38 01 lC C6 C6 FE 00 30 F4 01 02 03 04 00 Ff X: 0 plus5 plus12 start 107 011B 0110 01H 0121 0124 0126 0129 012B 012E 0130 0133 0135 ;First, disable interrupts and zero all segment registers cli mov aX,HO mov sS,ax mov dS,ax mov eS,ax ;Stop mapping all mem requests into Rom-mov al,H88 ;BootSequenceDone and mov dX,H20 outd ;ErrorCorrectionOff mov bx,UO ;start dispatch with 2 waitSec j .adr .adr .adr .adr FF A7 E5 00 0116 B2 00 0118 BF 00 00 Page ;not used ; ramtes·t 1abel wa itsec: LP: ;jump to routine plus5: waitSec plus12: mov mov outdw j aX,U3 ;+12 volts on dX,#100 waitSec ;Test low ram for errors-start: mov mov dl,UO di ,UO ;test number in dl ; and offset in di again: inc inc inc cmp je cmp je cmp je cmp je jmp dl di di dl,Ul Xtest dl,U2 Xtest dl,U3 Xtest dl,U4 Xtest Bootlt ;on to the next test ;and the next offset ; incremented by 2 for word ;dispatch on dl ;it fits ;test 2 ;it fits ; test 3 ;it fits ; test 4 ; it fits ;assume the RAM works BitsTable: .adr .adr .adr .adr . adr 0 OFFFF 00000 OAAAA 05555 ;not used ;Ones ;Zeroes ;AAAA ;5555 ; write bits in location and read Xtest: mov s i ,Hf i rs t mov bX,BitsTable!di 13: mov O!si,bx inc si inc si cmp si,Upast 13 jb back ;ram address ~ ;write in bits ;end or ram ; 11 op if below 0 5 20-Jun-79 10:23:38 Z-IOP.1s 0155 0158 015B 0150 015F 0161 0163 0165 0169 B9 00 00 BE 00 10 8B 04 33 C3 08 C8 FF C6 FF C6 81 FE 00 30 72 Fa 016B 89 80 28 10 016F EB AA 0171 BC 00 2E 00 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 0174 0177 0178 0179 017A 0170 0180 0183 B8 00 50 90 FC BE AO BF AO B9 28 F2 VolO,", (\10", A4 10') 0185 0188 018B 018C E8 78 OA E8 7C 08 2E C7 06 46 10 00 00 0192 0193 0197 OlgA 0190 2E E8 AO 04 E8 94 04 fB F3 019F 01A2 01A5 01A8 01AB 01AE OlAF 01B2 01B5 B8 BB E8 E8 E8 2E Al E8 EB 00 FO B8 60 7B 01B7 01BA 01BO 01CO 01C3 01C6 olC7 01CA 01CO B8 BB E8 E8 E8 2E Al E8 EB 01 FO AO 55 63 01CF 0102 0105 0108 010B alOE 010F OlE2 01E5 B8 BB E8 E8 E8 2E Al E8 EB 02 FO 88 3D 48 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 00 22 00 179 180 181 182 .Luv FF 1E 44 10 00 FF 04 04 04 A9 00 8E 04 FE 00 FF 04 04 04 A9 00 76 04 FE 00 FF 04 04 04 A9 00 5E 04 FE OlE7 88 03 00 mov xor or inc inc cmp jb cx,HO si,Hfirst ax,Olsi ax,bx cX,ax si si si,Hpast 14 mov jmp BitErrors!di ,cx ;Save error log in low mem again ; start all over mov mov 14 : Page ;mask of which bits are bad ; ram address 0 ; read back ram 1ocat ion contents ;any bits different? ;or them into mask ; end of ram ;next ;The ram wo rks, so now boot from the disk BootIt : mov mov push popf c1d mov mov mov rep movb call call seg mov RunAgain: seg callis call call jmp sp,HfirstSP ;initia1ize SP ax,HO ax ; zero f1 ags si ,#IntVectors d i , HRamlnts cx,H40. .!:lIT ,LlLI Romln it LoadFloppy cs JumpTo+2,HHO cs JumpTo Wa itNoBug Wa itBug RunAgain OivErr: HO: mov mov call call call seg mov call j ax,HO bx,HLedsOn SetP20 IntsOn Oisp1ayOn cs ax, .ErrorCursor ShowNewCursor HO mov mov call call call seg mov call j ax.Hl bx,HLedsOn SetP20 IntsOn OisplayOn cs ax, .ErrorCursor ShowNewCursor Hl mov mov call call call seg mov call j ax,H2 bx,HLedsOn SetP20 IntsOn DisplayOn cs ax, ;ErrorCursor ShowNewCursor H2 mov ax,H3 SST: Hl : NMI: H2: BPT: 6 up interrupt tables ;set segment to zero ; call the routine ;and in case it returns .. ;wait for no bug first, then ;run prog again on next bug Z-IOP.ls 20-Jun-79 10:23:38 OlEA BB FO FF OlEO E8 70 04 OHO to 25 04 OlF3 E8 33 04 OlF6 2E 01F7 Al A9 00 OlFA E8 46 04 OlFO EB FE OlFF 0202 0205 0208 020B 020E 020F 0212 0215 B8 BB E8 E8 E8 2E Al E8 EB 04 FO 58 00 IB 00 FF 04 04 04 A9 00 2E 04 FE 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 22 23 mov call call call seg mov call H3: j Page 7 bx,#LedsOn SetP20 IntsOn OisplayOn cs ax, .ErrorCursor ShowNewCursor H3 OVF: mov mov call call call seg mov call H4: j ax,#4 bx,#LedsOn SetP20 IntsOn OisplayOn cs ax, .ErrorCursor ShowNewCursor H4 .END .Get "Z-BitBLT.bca" ;bitblt code Z-BitBLT.bca This file contains BitBLT for the 8086 Version 2.0 Allthor' Tnf1;!ll~ .--_ .. _-. n;!n .. -""-"Last changed: March 8, 1979 3:54 PM - fixed minx/y clipping - fixed destination segment - saves/restores OS - uses fast shift 1 2 3 -_ 4 5 6 7 8 9 10 11 0002 0004 0006 0008 OOOA OOOC OOOE 0010 0012 0014 0016 0018 001A 001C OOlE 0020 0022 0024 0026 0028 0014 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 OESBYTE= OESSEG= OESRAST= DESFLD= OESX= OESY= WIDTH= HE IGHT= CLPX= CLPY= CLPWID= CLPHT= SRCBYTE= SRCSEG= SRCRAST= SRCFLD= SRCX= SRCY= FUNC= GRAY= TABSIZ= 2 ;TEMPS BEGIN ABOVE SAVED BP OESBYTE+2 OESSEG+2 DESRAST+2 OESFLD+2 OESX+2 OESY+2 WIDTH+2 HEIGHT+2 CLPX+2 CLPY+2 CLPWIO+2 CLPHT+2 SRCBYTE+2 SRCSEG+2 SRCRAST+2 SRCFLD+2 SRCX+2 SRCY+2 FUNC+2 GRAY+2-0ESBYTE/2 ;NO. WORDS IN CALLER'S TABLE 33 0000 002A 0032 0034 0036 0038 003A 003C 003E 0040 0042 004A 004C 004E 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 NOTE: PARALLEL TABLES ... meaning that the source parmeters must lie the same distance from the destination parameters in both tables. So check in the .LS file that zero= SRCBYTE-DESBYTE-SRCDEL+DESDEL TEMP FRAME FORMAT OESDEL= GRAY+2 ;4 VALS FOR Y MOD 4 OESWA= OESOEL+8 STARTBITS= OESWA+2 SKEW= STARTBITS+2 SKMSK= SKEW+2 HBAK= SKMSK+2 VBAK= HBAK+2 MASK1=· VBAK+2 MASK2= MASK1+2 SRCDEL= MASK2+2 ;4 VALS FOR Y MOD 4 SRCWA= SRCDEL+8 PRELD= SRCWA+2 HCQUNT= PRELD+2 20-Jun-79 10:23:38 Z-IOP.ls 0050 0052 0054 0056 0058 0060 0008 OOOC 0218 0218 021A 021C 021E 0220 0222 0224 0226 0228 022A 022C 022E 0230 0232 07 DO DO DO E3 E3 E3 E3 EB EB EB EB 03 FO 05 04 04 04 04 04 04 04 04 04 04 04 05 04 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 NWORDS= SRCN= SHIFTS= OPN= GRAYS= NTEI~PS= ; .LOC ; SOURCES: 72 73 74 75 76 77 78 79 80 0236 FO 04 81 HCOUNT+2 NWORDS+2 SRCN+2 SHIFTS+2 OPN+2 ;4 VALS FOR Y MOD 4 GRAYS+8 BRUSHFUNC= CONSTFUNC= 71 0/34 FO 04 Page 8 OC .+1/2*2 ; EVENWORD ALIGNMENT 1* TABLE OF SOURCE ft0UTINES .ADR SRCOOPO .ADR SRCO .ADR SRCO .ADR SRCO .AOR SRCl .AOR SRCl .AOR SRCl .AOR SRCl .AOR SRC2 .ADR SRC2 .AOR SRC2 .ADR SRC2 .ADR SRC30PO .ADR SRC3 .AOR SRC3 .ADR SRC3 82 0238 023A 023C 023E 17 18 lC 20 05 05 05 05 0240 0242 0244 0246 0248 024A 024C 024E 0250 0252 0254 0256 0258 025A 025C 025E 0260 00 01 03 07 OF 00 3F 7F FF FF FF FF 0262 0264 0266 0268 026A 026C 026E 0270 0272 0274 0276 0278 027A 027C 027E 0280 00 FF 00 00 00 00 00 00 00 01 03 07 OF FF FF FF FF 3F 7F FF CA C8 C6 C4 C2 CB CD CF D1 D8 06 D4 DO OF E1 E3 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 1F 1F 0282 E9 52 02 83 ; 84 OPS: 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 ; MASKTAB: 1* TABLE OF OPERATIONS .ADR OPO .ADR OPl .AOR OP2 .ADR OP3 1* TABLE OF MASKS .ADR 0 .ADR 1 .AOR 3 .ADR 7 .ADR OF .ADR IF .AOR 3F .ADR 7F .AOR OFF .ADR IFF .ADR 3FF .ADR 7FF .AOR OFFF .ADR lFFF .ADR 3FFF .AOR 7FFF .ADR OFFFF ; 1* TABLE OF SHIFTS (LEFT ROTATES) SHIFTTABLE: .ADR SHO .AOR SHl .ADR SH2 .ADR SH3 .ADR SH4 .AOR SH5 .AOR SH6 .AOR SH7 .ADR SH8 .AOR SH9 .ADR SH10 .ADR SHll .AOR SH12 .ADR SH13 .AOR SH14 .AOR SH15 ; JDONE: JMP DONE 1* ... and now, here's BITBLT! */ 8 20-Jun-79 10:23:38 Z-IOP.ls 0285 0288 0289 028B 83 EC 60 55 88 EC IE 028C 028E 0290 0292 0295 0298 0299 029A 8C 8E 88 83 89 FC F2 A5 0298 029E -a2Al 02A4 02A7 02AA 02AC 02AE 02BO 02B2 02B4 BE 8B 8B 8B 88 3B 7E 28 03 2B 03 DO CO FD C7 02 14 00 02 42 4A 52 5A 08 13 08 CB 03 C3 00 OA 22 OE 12 156 0286 88 D8 02B8 0288 02BE 02C1 02C3 02C6 02C8 02CA 02CC 02CF 0201 0203 0206 89 89 89 03 03 2B 70 03 89 85 0208 020B 020E 02EO 02E3 8B 8B 2B 25 89 42 4A 52 C2 5A 08 05 03 52 02 OA 22 OE 16 OE 7E AF 83 EE 02 74 C6 46 56 C2 OF 46 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 22 OA 00 36 157 i58 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 BITBL T: SUB PUSH MOV PUSH MOV MOV MOV ADD MOV CLO REP MOVW Page 9 SP,HNTEMPS BP BP ,SP ;NEW FRAME OS ;SAVE OS AX,SS ;BLT CALLER'S TABLE TO LOCAL MEMORY ES,AX 01,BP 01,HOESBYTE ;STARTS AT OFFSET 2 ex ,HTABSIZ 1* MAKE LOCAL COPY OF RECTANGLES, CHECKING BOUNDS SI offset =DESY-DESX for Y/HT, =0 for X/WID in this section: MOV SI,HDESY-DESX ;SI -) y and height YTHENX: MOV AX,DESX!BP!SI MOV CX,SRCX!BP!SI MOV OX,WIOTH!BP!SI MOV BX,CLPX!BP!SI CMP BX,AX ;CHECK FOR DEST ORIGIN < CLIPPING JLE XYOK SUB BX ,AX ADD CX,BX ;INCREASE SOURCE ORIGIN SUB OX,BX ;DECREASE EXTENT ADD AX,BX ;ANO MOVE DEST ORIG TO CLIP ORIGIN MOV BX,AX MOV OESX!BP~SI,AX MOV SRCXiBP!SI,CX MOV WIOTH!BP!SI,OX ADD AX,OX XYOK: ADD BX,CLPWID!BP!SI SUB BX,AX ;CHECK FOR DEST EXTENT TOO BIG JGE WHOK ADD OX,BX ;REOUCE WIDTH THAT MUCH MOV WIOTH!BP!SI,DX WHOK: TEST OX,DX JLE JDONE ;NO BLT IF WIDTH OR HEIGHT .LE. 0 SUB S1,HOESY-DESX ;Now S1 -) x and width JZ YTHENX ;BACK AGAIN TO DO· THE X'S , 1* CALCULATE SKEW FROM X'S FHX: MOV MOV SUB AND MOV AX,SRCX!BP OX,DESX!BP AX,DX AX,HOF SKEW!BP,AX ;skew = (sourcex-destx) & 15 177 02E6 2B 02E8 89 02EB FC 02EC 89 02EF 8B 02F1 25 02F4 SB 02F7 2B 02F9 89 02FC Dl 02FE 2E 02FF 8B 0303 89 0306 03 0309 FF 030B 81 030F SB 0312 2B 0314 Dl 0316 2E 0317 8B 031B F7 0310 89 **&15) CO 46 3A 46 C2 OF 10 08 5E E3 87 46 56 CA E2 OF OA E3 3C 00 00 34 40 02 3E OE OF 00 00 178 1* SET UP 1NCS AND MASKS ASSUMING NO OVERLAP 179 180 181 182 183 184 185 186 187 188 189 190 200 201 SUB MOV CLD MOV MOV AND MOV SUB MOV SHL SEG MOV MOV ADD DEC AND MOV SUB SHL SEG MOV NOT MOV 202 203 1* CHECK FOR POSSIBLE OVERLAP OF SOURCE AND DEST 191 192 193 194 195 196 197 198 87 40 02 DO 46 40 199 AX,AX ;zero HBAK!BP,AX ;normal r to 1 (-1 means back) ;same for hardware direction flag ;normal top-to-bottom VBAK!BP,AX AX,DX AX,HOF BX,HI0 BX,AX STARTBITS!BP,BX ;startbits~ 16-(destx&15) [1-16] BX ;WORO INDEX CS AX,MASKTAB!BX MASK1!BP,AX ;mask1~ MASKS!STARTBITS OX,WIOTH!BP OX OX,HOF BX,HOF BX,DX ;WORO INDEX BX CS AX,MASKTAB!BX AX MASK2!BP,AX ;mask2 = NOT MASKS! (15-{destx+width-l) 20-Jun-79 10:23:38 Z-IOP.ls 0320 0323 0326 0328 032B 032E 0330 8B 3B 75 8B 3B 75 E8 46 46 OB 46 46 03 3A 04 1C 0353 8B 4E 26 0356 81 El OF 00 035A 89 4E 26 0350 8B Fl 035F 01 E6 0361 2E 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 8B 85 74 8B 0330 81 0341 2B 0343 FF 0345 01 0347 81 034B 03 034E 01 0350 89 4E C9 16 5E E3 CB C9 C1 El 4E El 4E 36 0362 88 84 18 02 233 0366 89 46 0369 81 E6 0360 2E 036E 8B 84 0372 89 46 0375 83 F9 0378 7C 00 037A 83 F9 037D 7e 05 037F C7 46 0384 E8 9F 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 0333 0336 0338 033A 0387 8B 46 038A 2B 46 0380 FF C8 038F 70 OE 0391 8B 4E 0394 21 4E 0397 C7 46 039C B8 FO 039F 01 F8 03Al 01 F8 03A3 01 F8 03A5 01 F8 03A7 05 02 03AA 89 46 03AD 03BO 03B3 03B6 03B8 03BB 03BE 03CO 03C2 03C4 03C7 03CA 03CC 03CF BE 8B 25 01 03 8B F7 33 2B 8B 8B 2B 8B 33 18 46 02 E8 46 56 02 C2 C2 4A 5A 09 56 CA 02 1A 02 22 OF 00 01 00 3A 4C 52 06 00 38 02 56 08 OC 4C 00 00 01 OE 34 40 3E 40 00 00 FF 00 50 00 4C 00 50 3A 08 06 3C MOV CMP JNE MOV CMP JNE CALL , Page 10 AX,OESSEG!BP AX,SRCSEG!BP NOLAP AX,OESBYTE!BP AX,SRCBYTE!BP ~JOLAP OlAP 1* CALCULATE PRELD (NEED FOR EXTRA INITIAL WORD OF SOURCE) MOV CX,SKEW!BP TEST CX ,CX JZ SPRELO MOV BX,SRCX!BP AND BX,NOF SUB CX,BX DEC CX ROL CX AND CX,N1 ;=0 if skew gr (sourcex&15) else 1 ADD CX,HBAKIBP ;=0 if above XOR hbak=O SHL CX ; el se = +-2 dep on hbak SPRELD: MOV PRELD!BP,CX NOLAP: 1* SET UP SOURCES, OPS, AND GRAYS IF NECESSARY GRAYP: CNW: SNW: MOV AND MOV MOV SHL SEG MOV MOV AND SEG MOV MOV CMP JL CMP JL MOV CALL CX ,FUNC! BP CX,NOF FUNC!BP,CX SI,CX SI ;FUNC INDEXES WORD OF TABLE CS AX,SOURCES!SI SRCN!BP,AX SI,#6 ;OP INDEXES OPS CS AX,OPS!SI OPN!BP,AX CX,#BRUSHFUNC CNW ;NO GRAY NEEDED CX,NCONSTFUNC GRAYP PRELD!BP,N#O ;NO PRELOAD FOR CONST SOURCE GRAYPREP ;PREPARE 4-WORD TABLE OF GRAYS 1* CALC MOV SUB DEC JGE MOV AND MOV MOV SAR SAR SAR SAR ADD MOV NWORDS (no. words stored), MERGE MASKS IF NEG AX,WIDTH!BP AX, ST ARTB ITS! BP AX SNW CX,MASK2!BP ;IF WIDTHClipH? ;yes, Out of Bounds CX MouseX,ax al,MYOelta 20-Jun-79 10:23:38 Z-IOP.ls 0862 3B C2 0864 7C 00 51 52 0866 83 EB 02 0869 74 E5 086B EB OC 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 53 0860 89 8F lA 20 0871 EB F3 0873 89 97 lA 20 0877 EB ED 0879 087C 0882 0885 BA C7 Al 8B 00 06 20 IE 00 06 10 00 00 20 2F 20 0889 08SC OSSE OS90 OS93 OS95 B9 S5 74 A9 74 SO 80 DO C1 21 00 SO 05 OE lS 20 04 cmp jl ax,dx OOBO ; is MouseY < Cl ipY? ;yes, Out Of Bounds OX sub jz j bx,n2 YTX FIB ;offset zero, now ;go do X's ;Forced In Bounds mov j MouseX!bx,cx N ;force upper limit in MouseY/X mov j r~ouseX! bx, dx ;force lower 1 imit in MouseY/X mov mov mov mov dx,nO Offset,nnO ax,KWO bx,KWl ;forced in bounds ;0 means no META keys yet ;offset starts at 0 ;ax=KbdOata word 0 ;bx=KbdOata word 1 mov test jz test jz or cx,nOneMetaO ax,cx MetaWl aX,nMetaMBl Ml KbdStatus,U4 ;are any META keys down in WO? ;No, try word 1 ; is it mouse button 1? ; no, try next ;turn the 4 bit on 21 N: OOBC: OOBO: N FIB: 72 73 74 75 76 Page Ml : OS9A A9 00 40 77 test aX,nMetaRS ; is it right shift? 0890 74 08 78 .)~ '7 M2 'n" ,'-_ OS9F FF C2 08Ai C7 06 06 iO 40 00 79 80 Sl S2 83 S4 S5 S6 S7 S8 inc mov dx ;say META key down Offset ,##OSSh Ht ;make offset a shift test jz or ax,UMetaMB3 MetaWl KbdStatus ,Ul mov test jz test jz inc mov cx,#OneMetal bx,cx ;any META keys down in this word? TryLock ;nope, go to end bX,#ivietaLS ; is it left so ift? ; no, try control and MS2 M3 dx ; inc dx for shift flag Offset, #nOSSh Ht ;put sh ift offset in loc test jz inc add j or bX,UMetaC M4 dx Offset,#nOSCTRL TryLock KbdStatus,#2 ; is it control? ; if it isn't, it's mouse button 2 ;META key in effect ;add control offset ;now see if we can do ShiftLock ; MS2, and the two bit in cmp jne test jz mov dx,nO EndMetaKeys aX,#MetaLock EndMetaKeys Offset ,##OSLock ; is any other META key down? ;Yes, ignore if Lock down ; is Lock down by itself? ; no, overridden by other METAs ;yes, put lock offset in location OSA7 A9 SO 00 OSAA 74 05 OSAC SO OE 18 20 01 OSBI B9 90 04 OSB4 S5 09 OSB6 74 23 08B8 F7 C3 10 00 OSBC 74 OS OSBE FF C2 OSCO C7 06 06 10 40 00 OSC6 OSCA OSCC OSCE OS04 OS06 F7 74 FF 81 EB 80 C3 00 04 OA C2 06 06 10 eo 00 05 OE 18 20 02 080B 080E 08EO 08E3 08E5 S3 75 A9 74 C7 FA 00 OB 00 10 06 06 06 10 80 00 08EB OSEE OSF2 OSF6 OSF9 OSFF 0905 25 81 89 A3 C7 C7 BE 7F 2F E3 6F FB 1E 2F 20 20 20 06 02 10 04 00 06 00 10 00 00 03 00 0908 090e 0910 0912 0914 SB SB 33 23 75 S4 14 10 9C 2A 20 C3 C3 15 0916 89 9C 14 10 091A 83 06 00 10 10 09lF FF C6 M2: ; is mouse button 3 down? ;no, try next ;and a 1 in the status word MetaWl : 89 90 91 92 93 94 95 96 97 9S 99 100 101 102 103 104 105 106 107 lOS 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 ... M3: M4: TryLock: EndMetaKeys: and and mov mov mov mov mov NextWd: mov mov xor and jnz ax,UZeroMetaO bX,UZeroMetal KWl,bx KWO, ax Count,##4 BitsGone ,UNO si ,#WordZero ;zero the meta bits ;in both words ;put it back ; both words ; loop 4 times ;start with zeroth bit ;and word zero aX,OldKbdOata!si bx,KbdData!si aX,bx aX,bx ProeessWord ;g et the data from UART fetch ;get old data from last i nt. ; xor the words, then 1and in new, ;glvlng l's=key wldown transition ;if not zero, process word NewSetOfB its: mov add inc OldKbdData!si,bx ;save kbd word in old table BitsGone, #UI0 ;add 10H for next word si 20-Jun-79 10:23:38 Z-IOP.ls 0921 0923 0927 0929 FF FF 75 EB C6 OE 02 10 OF 6F 092B C7 06 04 10 01 00 0931 B9 10 00 04 10 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 0934 0938 093A 093E 0940 0942 0946 094A 0940 094F 0953 85 74 8B 03 FF 03 8B 83 EB 89 BF 06 57 16 01 CA 16 3E FF 22 3E 00 0956 095A 095C 095E 0962 3B 75 FF 89 E9 95 OE 21 09 C7 3E 7A 20 2C 00 0965 0969 096B 0960 096F FF OE 08 10 156 74 FF FF EB 06 0971 0975 0977 097B 0970 097 F 0982 0984 8B 01 89 01 FF 83 75 BF 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 32 33 00 10 06 10 OC 21 00 08 10 00 C7 C7 E5 3E E7 95 EF C7 FF 03 00 38 20 3A 20 20 00 0987 3B 3E 36 20 098B 74 04 0980 89 3E 38 20 0991 01 26 04 10 0995 E2 90 0997 E9 7C FF 099A 0990 09Al 09A3 Al 2B 70 05 38 20 06 36 20 03 20 00 09A6 A2 19 20 09A9 C3 1 2 3 4 5 6 7 inc decw jnz j Page si Count NextWd EndKbd ;increment index reg ;decrement loop count ;and loop back ;End keyboard handler Mask,DDl cX,DI0 ;one bit on ; start with low order bit aX,Mask NewBit dX,BitsGone dx,cx dx dX,Offset d i ,NIChars di ,#0 EndIC Templ,di di ,#0 ;is this bit a 1? ; no, get the next bit ;get word*16 as bits ;add this bit number,--)index ;but it's off by one ;add the offset ;how many interrupt chars ; are there any interrupts? ;no, go to end (was je EndIc) ;save it in Temp1 ; start with zero offset dX,ICList!di NotTh i sOne di IntKeY,di NewBit ;compare with first character ;not this character ;zero=no chars, so add 1 ;save it in flag register ;only 1 interrupt at a time Tempi EndIC di di NC ;decrement count ;end i f zero ;go to next character ;word/wide ;go to next character mov shl mov shr inc cmp jne mov di,WritePtr di KbdBuffer!di ,dx di di di ,##CBLength IncWP d i ,##0 ;get writePointer for insertion ; into word buffer ;save the word ;undo shift ;inc write ptr tentatively ;wrap around cmp je mov di,ReadPtr NewB it WritePtr, di ;Has the writepointer caught up ;yes, don't inc after all ;new writepointer shl w loop jmp Mask NextBit NewSetOfB its ; sh ift the bit left in the word, ;and loop again ;otherwise get new mov sub jge add ax, WritePtr aX,ReadPtr NoAdd aX,#CBlength mov KbdStatus+l,al ProcessWord: mov mov NextBit: test jz mov add dec add mov cmp j mov mov NC: cmp jne inc mov jmp NotThisOne: decw jz inc inc jmp EndIC: IncWP: NewBit : EndKbd: 09AA 2E ;subtract read from write ptr. ;if it's positive, ok ; othe rwi se add buffer length NoAdd: ;word of status{#chars in buf) ; retu rn to caller ret . END "Z-Cursor.bca" .Get Z-Cursor.bca ;move the cursor Update the cursor coordinates and move the cursor Author: Bruce Horn Last changed: April 20, 1979 8 9 10 22 OoCursor: seg cs 12:24 PM 20-Jun-79 10:23:38 Z-IOP.ls 09AB 09AE 0981 09B3 Al 3D 74 7C 62 21 00 00 02 09B5 09B8 09BA 09BC 09BF 09C3 09C5 09C8 09CC 88 8E 8E Al 38 75 Al 3B 74 00 08 CO 26 06 09 28 06 06 1F 00 20 lA 20 20 lC 20 09CE E8 04 00 0901 E8 OA 00 0904 C3 0905 0906 090A 0900 2E C5 36 22 21 E8 A8 F8 C3 09D£ 09El 09E3 09E5 09E8 09EB 09EF 09F2 09F5 09F8 09FC 09FF OA03 OA06 B8 00 00 8E 08 8E Al A3 2B A3 Al A3 28 A3 CO lA 26 06 3E lC 28 06 40 ~o 36 E8 7F C3 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 je jl ax, Cu rso rlock ax,#O Normal NCR ;no--it's ok ;if less than zero, no cursor Normal: je aX,#CurrentOS dS,ax eS,ax ax ,01 dMX aX,MouseX CR aX,OldMY aX,MouseY NCR ;has mouse Y changed? ;no, don't do cursor call call 8lt01 d 8ltNew ;blt out old cursor ; the n bIt inn ew mov mov mov mov cmp j ne mov cmp ;has mouse x loc changed? ;yes, must do cursor CR: NCR: ;return to caller ret 8lt01 d: cs si, .CursorTable ;get address of table 8it81t ;blt the cursor out 38 mov 39 mov mov mov mov sub mov mov mov sub mov lds call ret ax;#ClIrrentOS dS,ax eS,ax aX,MouseX ;Bit8lT saves OS OldMX,ax ax, Cu rso rXOff CursorX,ax aX,MouseY 01 dMY, ax aX,CursorYOff CursorY,ax si,.CursorTable ;Get cursor table Bit81t ;b1t new cursor in at new pos 41 42 43 44 45 46 47 48 49 50 51 52 53 34 35 1 23 . ;shou1d I ignore this cursor? seg 1ds call ret 40 20 20 5E 21 21 20 20 60 21 21 22 21 F8 mov cmp 11 Page 8ltNew: .ENO .Get "Z-ORW.bca" Z-ORW.bca ;disk code 2 3 4 5 6 7 8 9 This program loads and stores core images on the floppy disk in a fixed format: 128 bytes/sector, 16 sectors/track. For read, it is given a starting address and an ending address to load--it assumes that the correct disk is in, and that it starts at track zero, sector zero. Author: 8ruce Horn Last Edited: May 7, 1979 2:00 AM 10 11 0120 0120 0120 0122 0124 0126 OOFC 0077 0057 00E8 0080 0040 0001 0020 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ;Oisk 10 ports Port = StatReg = CmdReg = TrackReg = SectorReg = OataReg = 0120 Port Port Port+2 Port+4 Port+6 ;Address of controller ;Status Register in WO 1791 ;Command Register ;Track Register ;Sector Register ;Oata Register ;Oisk commands RstCmd= RdCmd= WrCmd= SeCmd= OFC 077 057 OE8 ;Restore ;Read ;Write ;Seek (w/verify--no verify, OEC) ;Status bits--Type I and Type II commands NotReady= 080 ;disk not ready WrtProtect= 040 ;Write protect tab on 8usy= 001 ;command in progress ;Status bits--type I commands only HdLoad= 020 ;Head loaded 20-Jun-79 10:23:38 Z-IOP.ls 0010 0004 0002 0010 0008 0004 0002 0067 0003 0010 001C OA07 OA08 OAOB OAOE OAll OA12 OA15 OA18 OAIB OAIE OA2l OA24 OA26 OA28 2E Al E8 E8 2E A1 E8 E8 E8 E8 87 00 35 FC 20 Fe 00 FC FC FB FC 00 BE BE E8 65 2B 92 EE 00 00 08 CO 1B OA2B OA2E OA30 OA32 OA35 OA37 OA3A OA3E OA41 OA45 OA47 OA4A OA4D OA50 OA53 OA55 OA58 DA5B OA5E OA60 OA63 DA66 OA69 OA6C 88 8E BE A2 FE A2 88 E8 88 8B A3 88 A3 A3 88 88 A3 A3 8E 88 A3 88 A3 C7 00 08 CO 56 CO 57 3E B8 36 04 48 44 4C 50 F8 44 4E 52 CO 44 54 44 44 06 00 DA72 OA76 OA7A OA7D OA80 OA83 OA84 OA86 06 06 E8 7C E8 OB 8A 20 EC 34 FF A8 lC BS FE FE 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 SeekErr= TrackOO= Index= 59 1n.~rll="t"\n.n\l. 60 61 62 63 64 65 66 67 68 69 70 seg mov call call seg mov call call call call mov mov mov call LoadDisk: mov mov mov mov inc mov mov call mov mov mov mov mov mov mov mov mov mov mov mov mov mov mov mov ReadNext: inc inc call call mov ind xor test 71 72 01 73 74 75 76 77 10 10 58 10 00 58 10 10 02 10 10 04 10 10 06 10 08 10 4A 10 08 00 57 10 57 10 00 01 01 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 Page 010 004 002 Track not verified Track zero index mark passed ;Statu,s bits--type II commands only RNF= 010 ;Record Not Found CRCErr= 008 ;CRC check invalid LostData= 004 ;8086 couldn't keep up with 1791 DataRQ= 002 ; 1971 wants data ;Non error status bits--mask off on read status--type ; TrackOO or Index or WrtProtect or HdLoad or Busy NonErrI= 067 ;Non error status bits--mask off on read status--type II ;DataRQ or Busy NonErrII= 003 ;Status bits for recoverable errors--Type I ;SeekErr RecErrI= 010 ;Status bits for recoverable errors--Type II ;RNF or CRCErr or LostData RecErrII= 01C LVU.UI 1'Vt-'I-'J. cs aX,.LoadDiskCursor ShowNewCursor Wa itBug cs a x , . Norm a 1Cur so r ShowNewCursor Hi deCu rso r IntsOff ;mask off interrupts DisplayOff aX,no dS,ax eS,ax DiskStart ;Zero the segments aX,no dS,ax eS,ax Track,al al Sector,al di,.Buffer ReadTS si,.Buffer aX,OO!si NextDisk,ax aX,02!si BeginAdr,ax OldAdr,ax di ,ax aX,04!si BeginSeg,ax OldSeg,ax eS,ax aX,06!si Blocks,ax aX,08!si JumpTo,ax ReTry,UU8. Sector Sector ReadTS DiskWait dX,UStatReg al, UOFF al,URecErrII ;Zero the segments ; the Track register, ;and set sector to 1 ;Write first sector to Buffer ;8yte address ;Continuation disk needed? ;Load from this address ; in th i s segment ;this many blocks ; and when done, jump to ; 8 retries on dsk error ;wait for status ok ;recoverable error? 24 20-Jun-79 10:23:38 Z-IOP.ls OAB8 OA8A OA8D OA8F OA92 OA94 OA98 OA9C OAAO OAA2 74 Al 8B Al 8E FE FE FF 75 E9 IB 50 F8 52 CO OE OE OE DO 38 OAA5 OAA7 OAA9 OAAC OAAE OABO OAB4 OAB6 OAB9 OABC OABE OACI OAC4 OAC7 OACD OADO CAD3 OAD6 OAD9 OADA 8B 8C E8 8E 8B FF 75 Al 3D EB E8 E8 E9 C7 E8 E8 EB E8 C3 AO 3C 7C 7F C6 EB FE E8 C6 E9 C7 C3 IB C3 F8 OE 24 48 01 09 57 65 40 06 Al 45 53 E7 DADO OADF OAEI OAE3 OAE8 OAEA OAEE OAFi OAF6 10 10 57 10 57 10 4A 10 01 01 54 10 10 00 FB FB FF 42 10 00 00 00 FB FB FB 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 jz mov mov mov mov dec dec decw jnz jmp SectorOK: mov mov call mov mov decw j nz mov cmp j DR: 135 136 137 57 10 DF 91 07 06 88 06 27 06 79 57 10 00 56 10 00 57 10 FF FF OAF9 B3 77 OAFB E8 AC 00 OAFE B4 00 OBOO EB 09 OB02 OB05 OB06 OB08 OB09 BA 26 01 EC 34 FF AA FE C4 OBOB OBOE OBOF OBll OB13 OB15 OB17 BA EC A8 74 A8 74 C3 OB18 OB19 OB 1F OB20 OB23 OB25 OB28 OB29 OB2B OB2E OB2F OB32 OB35 2E C7 2E AO 34 BA EE BO BA EE E8 BA EC 20 01 02 EF 01 F4 06 4A 10 08 00 56 10 Ff 26 01 E8 20 01 59 00 20 01 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 RNS: Ql: call call jmp mov call call ca 11 call ret mov cmp jl jg mov jmp inc call mov jmp Page SectorOK aX,OldAdr di ,ax aX,OldSeg eS,ax Sector Sector ReTry ReadNext DiskFail ax,di bx,es NextAdr es,bx di ,ax Blocks RNS ax,NextDisk ax,Hl DR IntsOn DisplayOn LoadFloppy DStatus,HHO DiskStop IntsOn ; no, its ok ;restore old address ;and old segment ; for 1 ater INC ;was jne DR (changed for test) ;next disk flag on, otherwise ;deselect drive n;",nl",,,nn • • ~ ~t' ~J~" ShowCursor ;Return to caller al,Sector al,#15. ReadNext Ql Sector,HO ReadNext Track Seek Sector ,HOfF ReadNext ;-1, with 2 incs, gives ReadTS: mov call mov j ReadData: mov ind xor stob inc ReadLoop: mov ind test jz test jz ret b1, HRdCmd DiskSetup ah,#O ReadLoop dX,#DataReg al,#OFF ;invert from WD bus ;store into di/es ah dX,HStatReg al,HDataRQ ReadData al,HBusy ReadLoop ;Data request? ;yes, read more data ;is it still busy? ;yes, wait again Seek: seg mov seg mov xor mov outd mov mov outd call mov ind cs ReTry,HH8. cs al,Track al,HOFF dX,HDataReg ;Invert for WD bus ;send it track number al,HSeCmd dx,HCmdReg DiskWait dX,HStatReg ;00 seek ;wait for dsk to be ready 25 20-Jun-79 10:23:38 Z-IOP.ls OB36 OB38 OB3A OB3C 34 FF A8 10 75 01 C3 OB30 FF OE 4A 10 OB41 75 05 OB43 E9 97 00 OB46 OB49 OB4C OB4F OB52 OB55 OB58 0858 OB5E OB61 0864 OB67 OB6A 0860 OB70 B8 BB E8 E8 B8 BB E8 E8 B8 BB E8 E8 E8 E8 C3 04 C7 07 AA 00 FF F8 9E 01 FF EF 21 8F 11 00 FF FB FA 00 EF FA FA 00 EF FA 00 FA 00 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 xor test jnz ret SeekError: decw jnz jmp Page al,DOFF al,DRecErrI SeekE rror ReTry Seek OiskFail OiskStart: mov mov call call mov mov call call mov mov call call call call ret ax,D4 bx, DO i skDr ive SetPI00 WaitASecond ax,DO bX,DOiskMR SetPI00 WaitASecond ax,Dl bX,DOiskMR SetPI00 OiskWait WaitASecond DiskRestore DiskStop: call call mov mov call ret DiskWait OiskRestore ax,DO bx,DOiskDrive SetP100 ; dese 1 ect drive al.DRstCmd dX,#CmdReg ;send command Oi skWa it ;wait for it to be ready dX,DStatReg ;get status register contents al,DBusy Oi skWa it ;is it still busy? ;yes, try again, ;otherwise return ax,D2 bX,DOiskPower SetPI00 WaitASecond ;Turn on first +5, then +12 ;wait for the disk to spin up ;wait a second on disk-mr ;disk MR may restore disk ;but if it doesn't ... 211 OB71 OB74 OB77 OB7A OB70 OB80 E8 E8 B8 BB E8 C3 17 OA 00 C7 06 00 00 00 FF FA OB81 BO FC 0883 BA 20 01 OB86 EE OB87 E8 01 00 OB8A C3 OB88 OB8E OB8F OB91 OB93 BA 20 01 EC A8 01 74 F8 C3 OB94 OB97 OB9A OB90 OBAO OBA3 OBA6 OBA9 B8 BB E8 E8 B8 BB E8 C3 02 FC B9 5C 03 FC AD OBAA OBAO OBAE OBAF OBB2 OBB4 OBB7 OBB8 aBBA OBBO E8 FC 2E AO 34 BA EE 8A BA EE DE FF aBBE OBCl OBC2 OBC4 BA 20 01 EC AS 01 74 F8 00 FF FA FA 00 FF FA 57 10 FF 24 01 C3 20 01 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 Oi skRestore: mov mov outd call ret OiskWait: mov ind test jz ret OiskPwrOn: mov mov call call mov ax,D3 mov call ret OiskSetup: call cld seg mov xor mov outd mov mov outd Wa itBusy: mov ind test jz bX,DOiskPower SetPI00 Oi skWa it ;wait for disk to be ready ;clear direction cs al,Sector al,HOFF dX,HSectorReg ; set secto r ; invert for WD bus al,bl dX,DCmdReg ;get command number ;send command dX,DStatReg ;get status register contents al,DBusy Wa itBusy ; is it busy yet? ;command not yet executing 26 20-Jun-79 10:23:38 Z-IOP.ls OBC6 C3 50 10 260 261 262 263 264 265 266 267 268 269 270 lE 52 10 272 OBC7 08C9 OBCC OBCE OBOO OB03 OB04 OB07 OB08 OBOC 8B B9 03 03 25 2E A3 2E 89 C3 00 04 00 EA OA OF 00 OBOO OBEO OBE3 OBE6 B8 BB E8 FB BA EC 34 2E A3 E8 E8 2E Al f8 EB OC 00 Fa FF 7A FA OBO OBEA OBEB aBED OBEE OBFl OBF4 OSf7 OBF8 OBFB OBFE 271 273 274 275 276 287 288 289 mov call FF 282 283 42 10 24 FA 32 FA A9 00 45 FA FE ;ax=byte address, bx=segment address NextAdr: mov dx,ax ;get byte address mov cx,H4 ;and shift right by four for shrv dx ;segment address to be added to bx,dx add ;old segment register ax,HOF and ;save low 4 bits of byte address cs seg mov OldAdr,ax cs seg OldSeg,bx mov ret 285 286 20 01 278 279 280 281 284 290 291 292 36 37 27 ret OiskFail: mov mov call sti mov ind xor seg mov call call 277 Page c:a.n ~~;::J OF: j ax,HOC bx,HLedsOn SetP20 ; set interrupts dX,HStatReg ;get status register al,HOFF ;invert for WO bus cs OStatus,ax ; save it IntsOn OisplayOn cs ax, . ErrorCursor ShowNewCursor OF ;halt machine .End .Get "Z-RI.bca n ;rom initialization Z-RI.bca This file contains all the necessary tables for normal execution in rom. Page 1 locations (at 2000H) will be initialized by a rep/movw sequence. 1 2 3 4 5 Author: Bruce Horn Last edited: May 7, 1979 6 7 12:34 AM 8 21AO 0017 0010 9 10 11 OCOO OC03 OC05 OC07 OC08 OCOB OCOF OC12 OC16 OC19 OCIA B8 8E 8E FC B9 8B BF 89 A3 F2 A5 00 00 08 OCIB OCIE OC22 OC25 OC26 B9 10 00 8B 36 43 00 BF AO 21 F2 A5 co 17 36 36 3E 24 00 13 00 21 22 21 21 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 OC27 B8 00 00 OC2A OC20 OC30 OC31 OC32 B9 06 00 BF 2A 20 F2 AB B9 06 00 34 35 36 37 38 39 40 41 CursorToBe= CBTblLength= CBMapLength= 21AO 23. 16. ;location of cursor bitmap ;in words, including offsets/lock ; in words RomIn it: mov mov mov cld mov mov mov mov mov rep movw ax,HCurrentOS ds,ax eS,ax mov mov mov rep movw cX,HCBMapLength ;length of cursor bitmap si, .Crsr ;address of cursor di,HCursorToBe ;and its destination ;incrementing cX,HCBTblLength ;how many words to move si,.CBTbl di,HCursorTable ;address of table to be .CursorTable,di ;save address in loc .CursorTable+2,ax ;and its segment ;and blt table up ; b 1 t tab 1 e up ;Zero registers, keyboard data blocks ... mov ax,HO ;to zero registers mov mov rep stow mov cx,H6. di,HKbdOata ;clear KbdData block ... cx,H6. 20-Jun-79 10:23:38 Z-1OP.ls OC35 BF 14 10 OC38 F2 OC39 AB OC3A OC40 OC46 OC4C OC52 OC55 OC58 OC5B OC5E OC61 OC64 OC67 OC6A OC60 OC70 OC73 OC79 OC7F OC85 OC8B OC91 OC97 OC90 OCA3 OCA9 OCAF OCB5 C7 C7 C7 C7 A3 A3 A3 A3 A3 A3 A3 A3 A3 A3 A3 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 oess C7 OCCI C7 06 06 06 06 26 28 lA lC 36 38 18 14 DC IE 20 06 06 06 06 06 06 06 06 06 06 06 06 06 06 OC DE 10 12 20 20 20 20 20 20 20 20 21 20 20 00 02 04 06 08 OA OC 30 32 34 36 38 3A 3C 10 10 10 10 03 00 88 OC 00 00 00 00 20 20 20 20 20 20 20 10 10 10 10 10 10 10 85 56 60 99 AD CO 00 43 29 21 31 3A 18 OC 02 06 06 06 06 06 OC 06 06 06 06 06 06 06 OCC7 C5 36 22 21 OCCB 8B 44 14 OCCE A3 22 20 OCDI 8B 44 16 OC04 A3 24 20 OC07 B8 80 02 OCOA 89 44 OC OCOO B8 EO 01 OCEO 89 44 OE OCE3 B8 DC 00 OCE6 89 44 24 OCE9 B8 00 00 OCEC 89 44 26 OCEF E8 93 F5 OCF2 2E OCF3 C5 36 22 21 OCF7 B8 10 00 OCFA 89 44 OC OCFO 89 44 OE 0000 B8 02 00 0003 89 44 24 0006 B8 FF FF 0009 89 44 26 OOOC E8 EF F9 OOOF E8 AE F9 0012 C3 0013 15 00 0015 0017 0019 0018 0010 OOH 0021 0023 0025 0027 0029 00 00 28 80 00 00 10 10 00 00 80 40 00 00 25 00 00 00 00 00 00 02 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 Page 28 mov rep stow d i , #01 dKbdOa ta mov mov mov mov mov mov mov mov mov mov mov mov mov mov mov mov mov mov mov mov mov mov mov Portl00,##3 ;initial port 100 bits Port60,##0 ;and port60 bits Port20,##88 ;and port 20 bits KbdOffset,##12. ;Kbd1nt won't hit before Odd1nt OldMX,ax ; last MX OldMY,ax ; last MY MouseX,ax ;MouseX MouseY,ax ;MouseY ReadPt r, ax ;ReadPtr \lJritePtr,ax ;WritePtr KbdStatus,ax ;Keyboard Status ICount,ax ; interrupt ctr. N1Chars,ax ; i nte rrupt chars RMX,ax ;lower limit of mouse x,y RMY,ax ; is zero .BitBlt,##BitBlt ;address of BitBlt .SetPI00,##SetPI00 ;address of SetPI00 .SetP20,##SetP20 .1nitOC,##1nitDC .HideCursor,##HideCursor .Showcursor,##ShowCursor .Romlnit,##Rom1nit .ShowNewCursor,##ShowNewCursor ni~nl~vnn .... I'" • - J ....... ;and OldKbdOata block ... nnnicnl~vnn t' • - J - •• ma\! • - mov mov mov mov mov .0isplayOff,##OisplayOff .WaitBug,##WaitBug .WaitNoBug,##WaitNoBug .IntsOn,##IntsOn .1ntsOff,##IntsOff , ...• ""'" , - ;Clear screen lds mov mov mov mov mov mov mov mov mov mov mov mov call seg lds mov mov mov mov mov mov mov call call ret si, .CursorTable aX,ClipW!si RMW,ax aX,Clipi-i!si RMH,ax ax,#640. OestW!si,ax ax,#480. OestH!si,ax aX,#StcBB Function!si,ax ax ,#White GrayBits!si ,ax BitBl t cs si, .CursorTable ax,#16. OestW!si ,ax OestH!si,ax ax ,#XorBB Function!si,ax ax,#Black GrayB its! s i , ax 101nit ShowCursor .CBTbl: .adr CBTbl ;get table for bitblt ;upper limit of mouse x,y ;is clipping corner ; full width ;for bitblt table ;and full height ;before screen clear ;clear screen white ;cursor width ;make sure funct ion is xor ;with all ones ;turn on CRT, keyboard ;now put up first cursor ;and return to caller CBTbl: · adr · adr .adr · adr .adr . adr .adr · adr · adr .adr .adr 4000 0 40. 240.*40. O. O. 16. 16. O. O. 640. ;byte - destination bitmap ;seg ; raster ;field size ;x - destination rectangle ;y ;width ;height ;x - clipping rectangle ;y ;width 20-Jun-79 10:23:38 Z-IOP.ls 0028 0020 002F 0031 0033 OD35 0037 0039 003B EO AO 00 01 08 00 00 02 FF 01 21 00 00 00 00 00 00 FF 0030 00 00 003F 00 00 0041 FF FF 0043 45 00 0045 0047 0049 004B 0040 004f 0051 0053 0055 OD57 0059 005B 0050 005F 0061 0063 00 00 00 00 FF 00 86 80 00 00 00 80 FF E6 86 86 FF FE FC E7 01 00 C8 98 FF Fe FE C3 00 8B A8 88 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 .Crsr: Page .adr .adr .adr .adr .adr . adr .adr .adr .adr 480. CursorToBe CurrentOS 8. O. O. 02 OFFFF .adr .adr 0 0 ;offset x ;offset y .adr OFFFF ; cursor lock (
Source Exif Data:File Type : PDF File Type Extension : pdf MIME Type : application/pdf PDF Version : 1.3 Linearized : No XMP Toolkit : Adobe XMP Core 4.2.1-c043 52.372728, 2009/01/18-15:56:37 Producer : Adobe Acrobat 9.2 Paper Capture Plug-in Modify Date : 2010:02:06 22:32:34-08:00 Create Date : 2010:02:06 22:32:34-08:00 Metadata Date : 2010:02:06 22:32:34-08:00 Format : application/pdf Document ID : uuid:644ca64a-8a3c-40d9-9411-6261fb65b7b7 Instance ID : uuid:5a718054-a1ce-4c13-b041-6bd83ddf39e8 Page Layout : SinglePage Page Mode : UseNone Page Count : 30EXIF Metadata provided by EXIF.tools