;---------------------------------------- ; ; LSI-M3 Boot prom ; Dissasembled by Steve Hunt, 28/08/2016 ; steve.hunt@iname.com ; ; dissasembled sufficiently to understand the requirements ; for a monitor prom and a cp/m 2 cbios. ; ; ; 1 x 6845 CRT controller ; 1 x 8251 USART handles RS232 I/O ; 1 x 8255 PPI handles keyboard I/O ; 1 x 8255 PPI handles parallel printer port output ; ; 0000-E5FF ram ; E600-E6FF scratch/work areas ; E700-E7FF default values including function key values ; E800-EFFF 6845 crt screen ram ; F000-F7FF this prom ; F800-FFFF hdd boot prom , if fitted ; ; addresses in [] denotes where code or data is copied to ram ; ;---------------------------------------- ; ; list of port numbers ; ;80 CTC0 ;81 CTC1 ;82 CTC2 ;83 CTC3 ;84 CRT_ADDR, CRT_STAT ;85 CRT_DATA ;86 ? -- not referenced here -- ;87 ? -- not referenced here -- ;88 FDC_CMD, FDC_STAT ;89 FDC_TRK ;8A FDC_SEC ;8B FDC_DATA ;8C USART_DATA -- not referenced here ;8D USART_CNTL ;8D USART_STAT ;8E ? -- not referenced here -- ;8F ? -- not referenced here -- ;90 ? -- not referenced here -- ;91 ? parallel port DATA (tested by shorting pins) ? -- not referenced here -- ;92 ? parallel port STAT ? ;93 ? parallel port CNTL (tested by shorting pins) ? -- not referenced here -- ;94 AUX_CNTL ; bit 6 = bell, bits 0&1 = fd selection ;95 KYBD_DATA ;96 KYBD_STAT ;97 KYBD_CNTL ; ;---------------------------------------- ; character definitions ; bell EQU 07h ; ascii bell bs EQU 08h ; ascii back space cr EQU 0dh ; ascii carriage return lf EQU 0ah ; ascii line feed esc EQU 1bh ; ascii escape space EQU 20h ; ascii space ;---------------------------------------- ; ; port definitions ; ; ; z80-ctc ports CTC0 equ 80h ; ctc channel 0 (baud rate gen for 8251) CTC1 equ 81h ; ctc channel 1 CTC2 equ 82h ; ctc channel 2 CTC3 equ 83h ; ctc channel 3 ; ; 6845 crt controller ports CRT_ADDR equ 84h ; address register CRT_STAT equ 84h ; status register CRT_DATA equ 85h ; data register ; ; fd1973 floppy disc controller ports FDC_CMD EQU 88h ; command port FDC_STAT EQU 88h ; status register FDC_TRK EQU 89h ; track register FDC_SEC EQU 8ah ; sector register FDC_DATA EQU 8bh ; data register ; ; 8251 universal synchronous/asyncronous receiver/transmitter ports USART_DATA EQU 8ch ; data register USART_CNTL EQU 8dh ; control register USART_STAT EQU 8dh ; status register ; ; auxillary control port AUX_CNTL EQU 94h ; buzzer + floppy disk select/handshaking ; bit 7 ; bit 6 - buzzer, 0=on, 1=off ; bit 5 ; bit 4 - ?? something disk related? ; bit 3 - ?? density select ; bit 2 ; bit 1 - \ 10 = selects drive 0 ; bit 0 - / 01 = selects drive 1 ; ; keyboard ports KYBD_DATA EQU 95h ; keyboard data KYBD_STAT EQU 96h ; keyboard status KYBD_CNTL EQU 97h ; ? mode control 8255 ? ; ;---------------------------------------- ; ; crt specific equates ; maxcol EQU 80 ; maximum columns maxrow EQU ????23 ; maximum rows ;---------------------------------------- ; ; memory map work areas ; word EQU E600h ;? word EQU E602h ;? crtrow EQU E604h ; console current row crtcol EQU E605h ; console current column byte EQU E606h ;? something to do with interrupt handler ?? word EQU E607h ;? 80bytes EQU E609h ;? ??E609 - E658?? - 1 line of 80 chars??? conmod EQU E659h ; [byte] console mode ; bit 7, ? ; bit 6, on=graphics, off=ascii text ; bit 5, on=inverse video, off=normal video ; bit 4, ? conhdl EQU E65Ah ; [word] conout handler address reqdsk EQU E65Ch ; [byte] required disk drive reqtrk EQU E65Dh ; [word] required track reqsec EQU E65Fh ; [word] required sector reqadr EQU E661h ; [word] required load address reqcnt EQU E663h ; [byte] required number of sectors oldnmi EQU E664h ; [4 bytes] store for old nmi address curtrks EQU E668h ; [2 bytes] current track for disk 0 & 1 35bytes EQU E677h-E699h ;? code copied from prom (at F298-F2BA) to ram ??bytes EQU E69Ah - E6FFh ;? filler? ;---------------------------------------- ; ; default parameters and tables [E700h - E7FFh) ; initial defaults set at bootup and then loaded from drive 0 boot sector ; dftparms EQU E700h ; [256 bytes] default settings reqcntdft EQU E705h ; [byte] default required no. of sectors byte EQU E706h ;? byte EQU E707h ;? ; bit flags critbl EQU E708h ; [16 bytes] crt init table critblend EQU E717h ; last byte of crt init table usartmode EQU E718h ; [byte] default usart mode usartcmd EQU E719h ; [byte] default usart command baudconst EQU E71Ah ; [byte] default baud rate time constant cpmiob EQU E71Bh ; [byte] default cp/m i/o byte byte EQU E71Ch ;? ; bit flags fnktable EQU E72F-E7FF ;? [208 bytes] function key table ;---------------------------------------- ; vidbuf EQU 0E800h ; video buffer E800-EFFF vidlen EQU 0800h ; length of vidio buffer (2k) ;---------------------------------------- ; ; hard disk prom addresses ; READHD EQU 0F800h ; read hard disk WRITEHD EQU 0F803h ; write hard disk WRITERDHD EQU 0F806h ; write/read-back hard disk SELECTHD EQU 0F809h ; select and home hard disk STATUSHD EQU 0F80Ch ; return hard disk status XFUNHD EQU 0F80Fh ; unknown hard disk function ;---------------------------------------- ; F000: JP F004 ;F000 C3 04 F0 ; cold start F003: NOP ;F003 00 F004: JP COLDSTART ;F004 C3 22 F0 ; cold start F007: JP CONST ;F007 C3 2C F1 ; console status F00A: JP CONIN ;F00A C3 37 F1 ; console input F00D: JP CONOUT ;F00D C3 41 F1 ; console output F010: JP READDSK ;F010 C3 44 F1 ; read disk F013: JP WRITEDSK ;F013 C3 66 F1 ; write disk F016: JP WRITERDDSK ;F016 C3 88 F1 ; write/read-back disk F019: JP SELHOMEDSK ;F019 C3 B6 F1 ; select and home disk F01C: JP DSKSTATUS ;F01C C3 D0 F1 ; return disk status F01F: JP XFUNHD ;F01F C3 0F F8 ; unknown hard disk function COLDSTART: DI ;F022 F3 ; disable interrupts IM 2 ;F023 ED 5E ; interrupt mode 2 LD SP,0100h ;F025 31 00 01 LD A,0 ;F028 3E 00 LD I,A ;F02A ED 47 ; interrupt table at 00xxh ; ; ctc channel 0 ; disable interrupts, timer, prescaler 16, falling edge ; auto trigger, no time constant, continued op, vector ; LD A,08h ;F02C 3E 08 ; 0000,1000 - see above OUT (CTC0),A ;F02E D3 80 ; ; ctc channels 1,2 & 3 ; disable interrupts, timer, prescaler 16, falling edge ; auto trigger, no time constant, sware reset, control word ; LD A,03h ;F030 3E 03 ; 0000,0011 - see above OUT (CTC1),A ;F032 D3 81 OUT (CTC2),A ;F034 D3 82 OUT (CTC3),A ;F036 D3 83 ; ; ctc channel 2 ; enable interrupts, counter, prescaler 16, rising edge ; auto trigger, time constant follows, sware reset, control word ; LD A,0D7h ;F038 3E D7 ; 1101,0111 - see above OUT (CTC2),A ;F03A D3 82 LD A,1 ;F03C 3E 01 ; time constant OUT (CTC2),A ;F03E D3 82 ; ; ? ; LD A,82h ;F040 3E 82 ; ? 1000,0010 OUT (93h),A ;F042 D3 93 LD A,0C0h ;F044 3E C0 ; ? 1100,0000 OUT (92h),A ;F046 D3 92 LD A,80h ;F048 3E 80 ; ? 1000,0000 OUT (92h),A ;F04A D3 92 LD A,0C0h ;F04C 3E C0 ; ? 1100,0000 OUT (92h),A ;F04E D3 92 ;---------------------------------------- ; ; set keyboard mode control (8255) ; port a & c (upper) mode 0 ; port a = output ; port c = output ; port b & c (lower) mode 1 ; port b = input ; LD A,86h ;F050 3E 86 ; 1000,0110 - see above OUT (KYBD_CNTL),A ;F052 D3 97 ; ? keyboard mode control 8255 ? LD A,73h ;F054 3E 73 ; 0111,0011 OUT (AUX_CNTL),A ;F056 D3 94 ; ; ; clear keyboard buffer ; CLRKYBD: LD B,16 ;F058 06 10 CLRKYBD2: IN A,(KYBD_DATA) ;F05A DB 95 DEC B ;F05C 05 JP NZ,CLRKYBD2 ;F05D C2 5A F0 ; ; set initial usart baud rate ; LD A,7Bh ;F060 3E 7B LD (usartmode),A ;F062 32 18 E7 ; usart default power-up mode LD A,2 ;F065 3E 02 ; ctc default 9600 baud time constant LD (baudconst),A ;F067 32 1A E7 CALL RESETBAUDRATE ;F06A CD 22 F1 ; reset baud rate to power-on default CALL RESETUSART ;F06D CD 0D F1 ; reset 8251 to power-on defaults ; ; copy initial 6845 crt register table to ram ; LD HL,CRTINITTBL ;F070 21 FB F0 LD DE,E708 ;F073 11 08 E7 LD BC,0010 ;F076 01 10 00 LDIR ;F079 ED B0 ; ; initialise display ; XOR A ;F07B AF LD (0003),A ;F07C 32 03 00 LD A,0FCh ;F07F 3E FC LD (E707),A ;F081 32 07 E7 LD (E71C),A ;F084 32 1C E7 CALL INITDISPLAY ;F087 CD 4A F3 ; ; signal end of nested priority interrupt handling to peripheral devices ; CALL DUMMYRETI ;F08A CD 0B F1 CALL DUMMYRETI ;F08D CD 0B F1 CALL DUMMYRETI ;F090 CD 0B F1 CALL DUMMYRETI ;F093 CD 0B F1 EI ;F096 FB ; ; copy floppy read/write code to ram ; RESETDSKS: LD HL,F298 ;F097 21 98 F2 LD DE,E677 ;F09A 11 77 E6 LD BC,0023 ;F09D 01 23 00 LDIR ;F0A0 ED B0 LD A,01 ;F0A2 3E 01 CALL SELHOMEDSK ;F0A4 CD B6 F1 ; select and home drive 1 XOR A ;F0A7 AF CALL SELHOMEDSK ;F0A8 CD B6 F1 ; select and home drive 0 LD A,0C9h ;F0AB 3E C9 ; ret opcode LD (0038h),A ;F0AD 32 38 00 ; set rst 38h to simply return ; ; if hard disk prom installed, ask if floppy boot required ; otherwise, just boot from floppy ; LD A,(0FFFCh) ;F0B0 3A FC FF ; check jump to hdd boot loader CP 0C3h ;F0B3 FE C3 ; q. jump instruction present? JP NZ,LOADBOOT ;F0B5 C2 CB F0 ; no - skip question LD HL,BOOTYN ;F0B8 21 2F F3 ; 'Boot from floppy disc y/n' CALL DSPMSG ;F0BB CD FE F2 ; display message CALL CONIN ;F0BE CD 37 F1 ; get key press AND 5Fh ;F0C1 E6 5F ; force upper case CP 'Y' ;F0C3 FE 59 ; q. Y pressed? JR Z,LOADBOOT ;F0C5 28 04 ; yes - jump to floppy boot CALL FFFC ;F0C7 CD FC FF ; no - call hdd boot loader RST 38H ;F0CA FF ; ; load floppy disk boot code and default settings ; LOADBOOT: LD HL,0000 ;F0CB 21 00 00 ; track 0 LD B,00 ;F0CE 06 00 ; sector 0 LD DE,0100h ;F0D0 11 00 01 ; load address LD A,00 ;F0D3 3E 00 ; disk 0 CALL READDSK ;F0D5 CD 44 F1 ; read disk OR A ;F0D8 B7 ; q. read successful? JP NZ,RESETDSKS ;F0D9 C2 97 F0 ; no - try again ; ; copy floppy boot default settings (as set by init.com) ; LD HL,0400h ;F0DC 21 00 04 LD DE,dftparms ;F0DF 11 00 E7 LD BC,0100h ;F0E2 01 00 01 LDIR ;F0E5 ED B0 LD A,(cpmiob) ;F0E7 3A 1B E7 LD (0003h),A ;F0EA 32 03 00 ; set default cp/m i/o byte CALL RESETBAUDRATE ;F0ED CD 22 F1 CALL RESETUSART ;F0F0 CD 0D F1 ; reset 8251 to floppy boot defaults ; ; re-initialise dispplay ; DI ;F0F3 F3 CALL INITDISPLAY ;F0F4 CD 4A F3 EI ;F0F7 FB ; ; execute floppy disk boot code ; JP 0100h ;F0F8 C3 00 01 ;---------------------------------------- ; ; 6845 crt initialisation table ; CRTINITTBL: db 100 ;F0FB [E708] 64 ; 00 HORIZ TOTAL-1 db 80 ;F0FC [E709] 50 ; 01 HORIZ DISPLAYED db 84 ;F0FD [E70A] 54 ; 02 HORIZ SYNC POSITION-1 db 10 ;F0FE [E70B] 0A ; 03 VERT/HORIZ SYNC WIDTH db 28 ;F0FF [E70C] 1C ; 04 VERT TOTAL-1 db 19 ;F100 [E70D] 13 ; 05 VERT TOTAL ADJUST db 24 ;F101 [E70E] 18 ; 06 VERT DISPLAYED db 25 ;F100 [E70F] 19 ; 07 VERT SYNC POSITION-1 db 0 ;F103 [E710] 00 ; 08 INTERLACE AND SKEW db 9 ;F104 [E711] 09 ; 09 MAX RASTER ADDRESS-1 db 97 ;F105 [E712] 61 ; 10 #CURSOR START RASTER db 9 ;F106 [E713] 09 ; 11 #CURSOR END RASTER db 0 ;F107 [E714] 00 ; 12 START ADDRESS MSB db 0 ;F108 [E715] 00 ; 13 START ADDRESS LSB db 0 ;F109 [E716] 00 ; 14 CURSOR ADDRESS MSB db 0 ;F10A [E717] 00 ; 15 CURSOR ADDRESS LSB ;---------------------------------------- ; ; dummy return from interrupt ; ; simply indicate to peripheral chips that priority interrupt complete ; DUMMYRETI: RETI ;F10B ED 4D ;---------------------------------------- ; ; reset 8251 usart to default state ; ; ; note the following mode, command and status byte formats ; ; -- mode byte format --------------------- ; 7 6 5 4 3 2 1 0 ; +----+----+----+----+----+----+----+----+ ; |s(2)|s(1)| ep |pen |l(2)|l(1)|b(2)|b(1)| ; +----+----+----+----+----+----+----+----+ ; ; s(2), s(1) = number of stop bits ; ep = odd or even parity ; pen = parity enable ; l(2),l(1) = word length bits ; b(2), b(1) = baud rate divisor bits (0,0 = sync) ; ; ; -- command byte format ------------------ ; 7 6 5 4 3 2 1 0 ; +----+----+----+----+----+----+----+----+ ; |EH |IR |RTS |ER |SBRK|RxE |DTR |TxEN| ; +----+----+----+----+----+----+----+----+ ; ; EH = enter hunt mode (no effect in async mode) ; IR = internal reset ; RTS = request to send (force high) ; ER = error reset (of PE OE and FE) ; SBRK = send a break ; RxE = receive enable ; DTR = data terminal ready (force on) ; TxE - transmitter enable ; ; ; -- status byte format ------------------- ; 7 6 5 4 3 2 1 0 ; +----+----+----+----+----+----+----+----+ ; |DSR |SDET|FE |OE |PE |TxE |RxR |TxR | ; +----+----+----+----+----+----+----+----+ ; ; DSR = data set ready ; SDET = sync detect/ break detect ; FE = framing error ; OE = Overrun error ; PE = parity error ; TxE = transmit buffer empty ; RxR = receiver ready ; TxR = transmitter ready ; ; RESETUSART: LD A,82h ;F10D 3E 82 ; dummy mode to force async OUT (USART_CNTL),A ;F10F D3 8D LD A,40h ;F111 3E 40 ; reset command OUT (USART_CNTL),A ;F113 D3 8D ; ; set default mode ; at power up this defaults to 7Bh ; = 0111,1011 ; = 1 stop bit, even parity, parity enabled, 7 bit char, x64 baud rate factor ; otherwise it is read from the boot disk ; LD A,(usartmode) ;F115 3A 18 E7 ; default mode OUT (USART_CNTL),A ;F118 D3 8D ; ; set default command ; = 37h = 0011,0111 ; = request to send, error reset, Rx, DTR and TX enable ; LD A,37h ;F11A 3E 37 ; default command OUT (USART_CNTL),A ;F11C D3 8D LD (usartcmd),A ;F11E 32 19 E7 ; store as default command RET ;F121 C9 ;---------------------------------------- ; ; reset ctc chanel 0 time constant for default baud rate ; (baud rate generator for usart) ; RESETBAUDRATE: ; ; ctc channel 0 ; disable interrupts, counter, prescaler 16, falling edge ; auto trigger, time constant follows, sware reset, control word LD A,47h ;F122 3E 47 ; 0100,0111 - see above OUT (CTC0),A ;F124 D3 80 ; ; set default time constant ; at power up this defaults to 02h ; = 9600 baud rate generator for usart ; otherwise it is read from the boot disk ; LD A,(baudconst) ;F126 3A 1A E7 ; default time constant OUT (CTC0),A ;F129 D3 80 RET ;F12B C9 ;---------------------------------------- ; ; Return console status ; CONST: LD C,KYBD_STAT ;F12C 0E 96 IN A,(C) ;F12E ED 78 ; console input status BIT 1,A ;F130 CB 4F ; q. key pressed? LD A,00 ;F132 3E 00 RET Z ;F134 C8 ; z = no DEC A ;F135 3D RET ;F136 C9 ; nz = yes ; ; Wait for and return console input ; CONIN: CALL CONST ;F137 CD 2C F1 ; q. key pressed? JP Z,CONIN ;F13A CA 37 F1 ; no - try again DEC C ;F13D 0D IN A,(C) ;F13E ED 78 ; read key value RET ;F140 C9 ;---------------------------------------- ; ; Console output ; CONOUT: JP F3E9 ;F141 C3 E9 F3 ;---------------------------------------- ; ; read disk ; READDSK: OR A ;F144 B7 ; q. bit 7 set? JP M,READHD ;F145 FA 00 F8 ; yes - read hard disk CALL SETFDPARMS ;F148 CD 86 F2 ; set floppy disk parameters CALL WAITDRVRDY ;F14B CD DD F1 ; check/wait for drive to be ready READDSK2: LD HL,READFDCDTA ;F14E 21 7E F2 ; address - read fdc data CALL F233 ;F151 CD 33 F2 CALL E677 ;F154 CD 77 E6 ; read sector to reqadr RET Z ;F157 C8 LD HL,reqcnt ;F158 21 63 E6 ; required number of sectors DEC (HL) ;F15B 35 ; decrement count RET Z ;F15C C8 ; return if all read LD A,(HL) ;F15D 7E AND 03h ;F15E E6 03 CALL Z,HOMEDRV ;F160 CC C0 F1 ; home drive JP READDSK2 ;F163 C3 4E F1 ;---------------------------------------- ; ; write disk ; WRITEDSK: OR A ;F166 B7 ; q. bit 7 set? JP M,WRITEHD ;F167 FA 03 F8 ; yes - write hard disk CALL SETFDPARMS ;F16A CD 86 F2 ; set floppy disk parameters CALL WAITDRVRDY ;F16D CD DD F1 ; check/wait for drive to be ready WRITEDSK2: LD HL,WRITEFDCDTA ;F170 21 82 F2 ; address - write fdc data CALL F233 ;F173 CD 33 F2 CALL E683 ;F176 CD 83 E6 RET Z ;F179 C8 LD HL,reqcnt ;F17A 21 63 E6 ; required number of sectors DEC (HL) ;F17D 35 ; decrement count RET Z ;F17E C8 ; return if all written LD A,(HL) ;F17F 7E AND 03h ;F180 E6 03 CALL Z,HOMEDRV ;F182 CC C0 F1 ; home drive JP WRITEDSK2 ;F185 C3 70 F1 ;---------------------------------------- ; ; write/read-back disk ; WRITERDDSK: OR A ;F188 B7 ; q. bit 7 set? JP M,WRITERDHD ;F189 FA 06 F8 ; yes - write/read-back hard disk CALL SETFDPARMS ;F18C CD 86 F2 ; set floppy disk parameters CALL WAITDRVRDY ;F18F CD DD F1 ; check/wait for drive to be ready WRITERDDSK2: LD HL,WRITEFDCDTA ;F192 21 82 F2 ; address - write fdc data CALL F233 ;F195 CD 33 F2 CALL E683 ;F198 CD 83 E6 JP NZ,WRITERDDSK4 ;F19B C2 A8 F1 LD HL,READFDCDTA ;F19E 21 7E F2 ; address - read fdc data CALL F233 ;F1A1 CD 33 F2 CALL E690 ;F1A4 CD 90 E6 RET Z ;F1A7 C8 WRITERDDSK4: LD HL,reqcnt ;F1A8 21 63 E6 ; required number of sectors DEC (HL) ;F1AB 35 ; decrement count RET Z ;F1AC C8 ; return if all written LD A,(HL) ;F1AD 7E AND 03 ;F1AE E6 03 CALL Z,HOMEDRV ;F1B0 CC C0 F1 ; home drive JP WRITERDDSK2 ;F1B3 C3 92 F1 ;---------------------------------------- ; ; select and home required disk drive ; SELHOMEDSK: OR A ;B7 ; q. bit 7 set? JP M,SELECTHD ;F1B7 FA 09 F8 ; yes - select hard disk LD (reqdsk),A ;F1BA 32 5C E6 ; set required disk number CALL SELECTDRV ;F1BD CD F7 F1 ; select drive ; ; home and unload current floppy drive ; HOMEDRV: LD A,02 ;F1C0 3E 02 ; seek trk 0, unload, no verify, 20ms step OUT (FDC_CMD),A ;F1C2 D3 88 ; send fdc command PUSH IX ;F1C4 DD E5 ; small.. POP IX ;F1C6 DD E1 ; ..delay HOMEDRV2: IN A,(FDC_STAT) ;F1C8 DB 88 ; read fdc status BIT 0,A ;F1CA CB 47 ; q. drive busy? JP NZ,HOMEDRV2 ;F1CC C2 C8 F1 ; yes - loop RET ;F1CF C9 ;---------------------------------------- ; ; return fdc status for required drive ; DSKSTATUS: OR A ;F1D0 B7 ; q. bit 7 set? JP M,STATUSHD ;F1D1 FA 0C F8 ; yes - return hard disk status LD (reqdsk),A ;F1D4 32 5C E6 ; set required disk number CALL SELECTDRV ;F1D7 CD F7 F1 ; select drive IN A,(FDC_STAT) ;F1DA DB 88 ; read fdc status RET ;F1DC C9 ;---------------------------------------- ; ; check/wait for drive to be ready ; WAITDRVRDY: LD A,(reqcntdft) ;F1DD 3A 05 E7 LD (reqcnt),A ;F1E0 32 63 E6 ; required number of sectors CALL SELECTDRV ;F1E3 CD F7 F1 ; select drive IN A,(FDC_STAT) ;F1E6 DB 88 ; read fdc status OR A ;F1E8 B7 RET P ;F1E9 F0 ; return if drive ready (bit 7 clear) LD HL,NODISK ;F1EA 21 0C F3 ; 'Disc expected in selected drive' CALL DSPMSG ;F1ED CD FE F2 ; display message WAITDRVRDY2: IN A,(FDC_STAT) ;F1F0 DB 88 ; read fdc status OR A ;F1F2 B7 ; q. drive not ready (bit 7 set)? JP M,WAITDRVRDY2 ;F1F3 FA F0 F1 ; yes - loop RET ;F1F6 C9 ;---------------------------------------- ; ; selects the required physical drive (0 or 1) and resets the ; fdc current track number to that last accessed by that drive ; SELECTDRV: IN A,(AUX_CNTL) ;F1F7 DB 94 BIT 0,A ;F1F9 CB 47 ; q. side 0? LD HL,curtrks ;F1FB 21 68 E6 ; point to side 0 track store IN A,(FDC_TRK) ;F1FE DB 89 ; get current fdc track no. JP NZ,SELECTDRV2 ;F200 C2 04 F2 INC HL ;F203 23 ; no - point to side 1 track store SELECTDRV2: LD (HL),A ;F204 77 ; save current track no LD A,(reqdsk) ;F205 3A 5C E6 ; required disk number CP 00 ;F208 FE 00 ; q. drive 0, side 0? LD C,02 ;F20A 0E 02 ; 0000,0010 JP Z,SELECTDRV4 ;F20C CA 1F F2 ; yes CP 01 ;F20F FE 01 ; q. drive 1, side 0? LD C,01 ;F211 0E 01 ; 0000,0001 JP Z,SELECTDRV4 ;F213 CA 1F F2 ; yes CP 02 ;F216 FE 02 ; q. drive 0, side 1? LD C,06 ;F218 0E 06 ; 0000,0110 JP Z,SELECTDRV4 ;F21A CA 1F F2 ; yes ; assume drive 1, side 1 LD C,05 ;F21D 0E 05 ; 0000,0101 SELECTDRV4: IN A,(AUX_CNTL) ;F21F DB 94 ; read floppy select/handshaking port AND 0F8h ;F221 E6 F8 ; 1111,1000 ; mask off bottom 3 bits OR C ;F223 B1 ; reset bottom 3 bits as determined above OUT (AUX_CNTL),A ;F224 D3 94 ; select floppy drive (+ density?) BIT 0,A ;F226 CB 47 ; q. side 0? LD HL,curtrks ;F228 21 68 E6 ; point to side 0 track store JP NZ,SELECTDRV6 ;F22B C2 2F F2 INC HL ;F22E 23 ; no - point to side 1 track store SELECTDRV6: LD A,(HL) ;F22F 7E ; retrieve saved track number OUT (FDC_TRK),A ;F230 D3 89 ; reset fdc track no. RET ;F232 C9 ;---------------------------------------- F233: ; ; replace nmi routine to that passed in hl ; PUSH HL ;F233 E5 LD HL,0066h ;F234 21 66 00 LD DE,oldnmi ;F237 11 64 E6 LD BC,4 ;F23A 01 04 00 LDIR ;F23D ED B0 ; save current nmi address POP HL ;F23F E1 LD DE,0066h ;F240 11 66 00 LD BC,4 ;F243 01 04 00 LDIR ;F246 ED B0 ; replace nmi with new code ; ; seek to required track ; LD HL,(reqtrk) ;F248 2A 5D E6 LD A,L ;F24B 7D OUT (FDC_DATA),A ;F24C D3 8B ; send track number to fdc LD A,1Ah ;F24E 3E 1A ; seek, head load, 20ms stepping OUT (FDC_CMD),A ;F250 D3 88 ; send fdc seek command PUSH IX ;F252 DD E5 ; small.. POP IX ;F254 DD E1 ; ..delay F256: IN A,(FDC_STAT) ;F256 DB 88 ; read fdc status BIT 0,A ;F258 CB 47 ; q. drive busy? JP NZ,F256 ;F25A C2 56 F2 ; yes - loop ; ; ; IN A,(AUX_CNTL) ;F25D DB 94 RES 3,A ;F25F CB 9F LD H,A ;F261 67 LD A,(E706h) ;F262 3A 06 E7 CP L ;F265 BD LD A,H ;F266 7C JP NC,F26C ;F267 D2 6C F2 SET 3,A ;F26A CB DF F26C: OUT (AUX_CNTL),A ;F26C D3 94 LD HL,(reqsec) ;F26E 2A 5F E6 ; required sector number LD A,L ;F271 7D OUT (FDC_SEC),A ;F272 D3 8A ; set sector LD HL,F2D9 ;F274 21 D9 F2 CALL F2BB ;F277 CD BB F2 LD HL,(reqadr) ;F27A 2A 61 E6 ; get load address RET ;F27D C9 ;---------------------------------------- READFDCDTA: IN A,(FDC_DATA) ;F27E DB 8B ; read fdc data RETN ;F280 ED 45 ; return with maskable interrupts enabled WRITEFDCDTA: OUT (FDC_DATA),A ;F282 D3 8B ; write fdc data RETN ;F284 ED 45 ; return with maskable interrupts enabled ;---------------------------------------- ; ; set floppy disk parameters ; SETFDPARMS: LD (reqadr),DE ;F286 ED 53 61 E6 ; required load address LD (reqdsk),A ;F28A 32 5C E6 ; required disk number LD (reqtrk),HL ;F28D 22 5D E6 ; required track number LD L,B ;F290 68 LD H,00 ;F291 26 00 INC HL ;F293 23 ; fdc sectors start from 1 LD (reqsec),HL ;F294 22 5F E6 ; required sector number RET ;F297 C9 ;---------------------------------------- ; ; rom code moved to and executed in ram - why? ; F298: E677: LD A,84h ;F298 [E677] 3E 84 ; read sector, head load, 6ms OUT (FDC_CMD),A ;F29A [E679] D3 88 ; send fdc command HALT ;F29C [E67B] 76 F29D: E67C: LD (HL),A ;F29D [E67C] 77 INC HL ;F29E [E67D] 23 IN A,(FDC_DATA) ;F29F [E67E] DB 8B JP E67C ;F2A1 [E680] C3 7C E6 F2A4: E683: LD A,0A4h ;F2A4 [E683] 3E A4 ; write sector, head load, 6ms OUT (FDC_CMD),A ;F2A6 [E685] D3 88 ; send fdc command LD A,(HL) ;F2A8 [E687] 7E HALT ;F2A9 [E688] 76 F2AA: E689: INC HL ;F2AA [E689] 23 LD A,(HL) ;F2AB [E68A] 7E OUT (FDC_DATA),A ;F2AC [E68B] D3 8B JP E689 ;F2AE [E68D] C3 89 E6 F2B1: E690: LD A,84h ;F2B1 [E690] 3E 84 ; read sector, head load, 6ms OUT (FDC_CMD),A ;F2B3 [E692] D3 88 ; send fdc command HALT ;F2B5 [E694] 76 F2B6: E695: IN A,(FDC_DATA) ;F2B6 [E695] DB 8B JP E695 ;F2B8 [E697] C3 95 E6 ;---------------------------------------- F2BB: DI ;F2BB F3 IN A,(FDC_DATA) ;F2BC DB 8B IN A,(FDC_STAT) ;F2BE DB 88 ; tickle the fdc! LD (000Ah),HL ;F2C0 22 0A 00 IN A,(AUX_CNTL) ;F2C3 DB 94 RES 4,A ;F2C5 CB A7 OUT (AUX_CNTL),A ;F2C7 D3 94 ; ; ctc channels 2 & 3 ; disable interrupts, timer, prescaler 16, falling edge ; auto trigger, no time constant, sware reset, control word ; LD A,03h ;F2C9 3E 03 ; 0000,0011 - see above OUT (CTC2),A ;F2CB D3 82 OUT (CTC3),A ;F2CD D3 83 ; ; ctc channel 1 ; enable interrupts, counter, prescaler 16, rising edge ; auto trigger, time constant follows, sware reset, control word ; LD A,0D7h ;F2CF 3E D7 ; 1101,0111 - see above OUT (CTC1),A ;F2D1 D3 81 LD A,1 ;F2D3 3E 01 ; time constant OUT (CTC1),A ;F2D5 D3 81 EI ;F2D7 FB RET ;F2D8 C9 ;---------------------------------------- F2D9: DI ;F2D9 F3 IN A,(AUX_CNTL) ;F2DA DB 94 SET 4,A ;F2DC CB E7 OUT (AUX_CNTL),A ;F2DE D3 94 ; ; ctc channel 1 ; disable interrupts, timer, prescaler 16, falling edge ; auto trigger, no time constant, sware reset, control word ; LD A,03h ;F2E0 3E 03 ; 0000,0011 - see above OUT (CTC1),A ;F2E2 D3 81 ; ; ctc channel 2 ; enable interrupts, counter, prescaler 16, rising edge ; auto trigger, time constant follows, sware reset, control word ; LD A,0D7h ;F2E4 3E D7 ; 1101,0111 - see above OUT (CTC2),A ;F2E6 D3 82 LD A,1 ;F2E8 3E 01 ; time constant OUT (CTC2),A ;F2EA D3 82 IN A,(FDC_STAT) ;F2EC DB 88 ; read fdc status POP DE ;F2EE D1 LD HL,oldnmi ;F2EF 21 64 E6 LD DE,0066 ;F2F2 11 66 00 LD BC,0004 ;F2F5 01 04 00 LDIR ;F2F8 ED B0 OR A ;F2FA B7 EI ;F2FB FB RETI ;F2FC ED 4D ;---------------------------------------- ; ; Display $ terminated message routine ; DSPMSG: LD A,(HL) ;F2FE 7E CP '$' ;F2FF FE 24 RET Z ;F301 C8 LD C,A ;F302 4F PUSH HL ;F303 E5 CALL CONOUT ;F304 CD 41 F1 POP HL ;F307 E1 INC HL ;F308 23 JP DSPMSG ;F309 C3 FE F2 ;---------------------------------------- NODISK: db cr,lf,'Disc Expected in Selected Drive',bell,'$' ;F30C BOOTYN: db esc,'E',Boot from Floppy Disc ? $' ;F32F ;---------------------------------------- ; ; initialise display and 6845 crt ; INITDISPLAY: LD HL,0000 ;F34A 21 00 00 LD (E602),HL ;F34D 22 02 E6 LD (E600),HL ;F350 22 00 E6 XOR A ;F353 AF LD (crtrow),A ;F354 32 04 E6 LD (crtcol),A ;F357 32 05 E6 LD (E606),A ;F35A 32 06 E6 LD (conmod),A ;F35D 32 59 E6 LD HL,F401 ;F360 21 01 F4 ; standard conout handler LD (conhdl),HL ;F363 22 5A E6 ; set conout handler ; ; initialise 6845 crt registers from table ; INITCRT: LD HL,E717 ;F366 21 17 E7 ; point to end of 6845init table LD C,CRT_DATA ;F369 0E 85 ; 6845 data register LD B,16 ;F36B 06 10 ; table length +1 INITCRT2: LD A,B ;F36D 78 DEC A ;F36E 3D ; get regnum into A OUT (CRT_ADDR),A ;F36F D3 84 ; select crt address register OUTD (C),(HL) ;F371 ED AB ; [C]<-(HL); B<-B-1; HL<-HL-1 ; write table value to crt data register JP NZ,INITCRT2 ;F373 C2 6D F3 ; loop until all table written LD HL,F38D ;F376 21 8D F3 LD (000Ch),HL ;F379 22 0C 00 ; ? set crt vsync interrupt address ; ; initialise crt ram to spaces ; INITCRTRAM: LD HL,vidbuf ;F37C 21 00 E8 ; crt ram buffer LD BC,vidlen ;F37F 01 00 08 ; length of crt ram LD E,space ;F382 1E 20 ; init character INITCRTRAM2: LD (HL),E ;F384 73 ; set character INC HL ;F385 23 ; bump pointer DEC BC ;F386 0B ; decrement counter LD A,B ;F387 78 OR C ;F388 B1 JP NZ,INITCRTRAM2 ;F389 C2 84 F3 ; loop until all buffer cleared RET ;F38C C9 ;---------------------------------------- ; ; ??? interrupt service routine for crtc vsync interrupt ??? F38D: EX AF,AF' ;F38D 08 LD A,(E606) ;F38E 3A 06 E6 OR A ;F391 B7 JP Z,F3E5 ;F392 CA E5 F3 EXX ;F395 D9 LD C,A ;F396 4F LD B,00 ;F397 06 00 LD DE,(E607) ;F399 ED 5B 07 E6 LD HL,E609 ;F39D 21 09 E6 LDIR ;F3A0 ED B0 LD HL,0000 ;F3A2 21 00 00 LD A,(crtrow) ;F3A5 3A 04 E6 LD BC,0050 ;F3A8 01 50 00 OR A ;F3AB B7 JP Z,F3B4 ;F3AC CA B4 F3 F3AF: ADD HL,BC ;F3AF 09 DEC A ;F3B0 3D JP NZ,F3AF ;F3B1 C2 AF F3 F3B4: LD C,00 ;F3B4 0E 00 LD A,(crtcol) ;F3B6 3A 05 E6 CP maxcol ;F3B9 FE 50 ; q. last column? JP NZ,F3C1 ;F3BB C2 C1 F3 LD A,4F ;F3BE 3E 4F INC C ;F3C0 0C F3C1: LD E,A ;F3C1 5F LD D,00 ;F3C2 16 00 ADD HL,DE ;F3C4 19 EX DE,HL ;F3C5 EB LD HL,(E600) ;F3C6 2A 00 E6 ADD HL,DE ;F3C9 19 LD A,14 ;F3CA 3E 0E OUT (CRT_ADDR),A ;F3CC D3 84 ; select cursor high address LD A,H ;F3CE 7C OUT (CRT_DATA),A ;F3CF D3 85 LD A,15 ;F3D1 3E 0F ' select cursor low address OUT (CRT_ADDR),A ;F3D3 D3 84 LD A,L ;F3D5 7D OUT (CRT_DATA),A ;F3D6 D3 85 ADD HL,BC ;F3D8 09 LD A,H ;F3D9 7C AND 07 ;F3DA E6 07 LD H,A ;F3DC 67 LD (E602),HL ;F3DD 22 02 E6 EXX ;F3E0 D9 XOR A ;F3E1 AF LD (E606),A ;F3E2 32 06 E6 F3E5: EX AF,AF' ;F3E5 08 EI ;F3E6 FB RETI ;F3E7 ED 4D ;---------------------------------------- ; ; send char via current conout handler ; F3E9: RES 7,C ;F3E9 CB B9 ; strip parity LD HL,(conhdl) ;F3EB 2A 5A E6 ; get conout handler JP (HL) ;F3EE E9 ; go to it ;---------------------------------------- ; ; conout escape code handler ; F3EF: LD A,C ;79 AND 60 ;F3F0 E6 60 JP Z,F401 ;F3F2 CA 01 F4 LD HL,F401 ;F3F5 21 01 F4 ; standard conout handler LD (conhdl),HL ;F3F8 22 5A E6 ; set conout handler LD HL,ESCTABLE ;F3FB 21 30 F4 JP F40A ;F3FE C3 0A F4 F401: LD A,C ;F401 79 AND 60 ;F402 E6 60 JP NZ,F45B ;F404 C2 5B F4 LD HL,F41D ;F407 21 1D F4 F40A: BIT 7,(HL) ;F40A CB 7E RET NZ ;F40C C0 LD A,(HL) ;F40D 7E INC HL ;F40E 23 CP C ;F40F B9 JP Z,F418 ;F410 CA 18 F4 INC HL ;F413 23 INC HL ;F414 23 JP F40A ;F415 C3 0A F4 F418: LD E,(HL) ;F418 5E INC HL ;F419 23 LD D,(HL) ;F41A 56 EX DE,HL ;F41B EB JP (HL) ;F41C E9 ; ; special console output handling table ; F41D: db bell ;F41D 07 ; bell dw SOUNDBELL ;F41E 7B F7 db bs ;F420 08 ; backspace dw F57F ;F421 7F F5 db lf ;F423 0A ; lf dw F553 ;F424 53 F5 db cr ;F426 0D ; cr dw F546 ;F427 46 F5 db esc ;F429 1B ; esc dw F774 ;F42A 74 F7 db 1ch ;F42C 1C dw F60C ;F42D 0C F6 db 0FFh ;F42F FF ; end of table ; ; escape code console output table ; ESCTABLE: db 'A' ;F430 41 ; ESC A - cursor up dw ESCCURUP ;F431 43 F6 db 'B' ;F433 42 ; ESC B - cursor down dw ESCCURDOWN ;F434 49 F6 db 'C' ;F436 43 ; ESC C - cursor right dw ESCCURRIGHT ;F437 55 F6 db 'D' ;F439 44 ; ESC D - cursor left dw ESCCURLEFT ;F43A 4F F6 db 'E' ;F43C 45 ; ESC E - clear screen dw ESCCLS ;F43D A2 F6 db 'F' ;F43F 46 ; ESC F - graphics mode dw ESCGRAPHIC ;F440 86 F7 db 'G' ;F442 47 ; ESC G - ascii mode dw ESCASCII ;F443 8C F7 db 'H' ;F445 48 ; ESC H - home cursor dw ESCHOMECUR ;F446 F2 F6 db 'I' ;F448 49 ; ESC I - cursor up and scroll down dw ESCCURUPSCR ;F449 B1 F5 db 'J' ;F44B 4A ; ESC J - erase to end of screen dw ESCERASEEOS ;F44C B4 F6 db 'K' ;F44E 4B ; ESC K - erase to end of line dw ESCERASEEOL ;F44F D8 F6 db 'R' ;F451 52 ; ESC R - toggle inverse video dw ESCTOGGLEINV ;F452 92 F7 db 'X' ;F454 58 ; ESC X - erase line dw ESCERASELINE ;F455 FD F6 db 'Y' ;F457 59 ; ESC Y - position cursor dw ESCPOSCUR ;F458 5B F6 db 0FFh ;F45A FF ; end of table ; ; ?? ; F45B: LD HL,conmod ;F45B 21 59 E6 BIT 7,(HL) ;F45E CB 7E JP Z,F466 ;F460 CA 66 F4 CALL F532 ;F463 CD 32 F5 F466: LD HL,conmod ;F466 21 59 E6 LD A,C ;F469 79 BIT 6,(HL) ;F46A CB 76 JP Z,F478 ;F46C CA 78 F4 CPL ;F46F 2F AND 60 ;F470 E6 60 LD A,C ;F472 79 JP NZ,F478 ;F473 C2 78 F4 AND 1F ;F476 E6 1F F478: BIT 5,(HL) ;F478 CB 6E JP Z,F47F ;F47A CA 7F F4 XOR 80 ;F47D EE 80 F47F: LD C,A ;F47F 4F LD A,(E707) ;F480 3A 07 E7 BIT 1,A ;F483 CB 4F JP Z,F49C ;F485 CA 9C F4 LD A,(crtcol) ;F488 3A 05 E6 CP maxcol ;F48B FE 50 ; q. last column? JP NZ,F49C ;F48D C2 9C F4 PUSH BC ;F490 C5 DEC A ;F491 3D LD (crtcol),A ;F492 32 05 E6 CALL F60C ;F495 CD 0C F6 CALL F532 ;F498 CD 32 F5 POP BC ;F49B C1 F49C: DI ;F49C F3 LD A,(E606) ;F49D 3A 06 E6 OR A ;F4A0 B7 JP NZ,F4AE ;F4A1 C2 AE F4 LD HL,(E602) ;F4A4 2A 02 E6 LD DE,vidbuf ;F4A7 11 00 E8 ADD HL,DE ;F4AA 19 LD (E607),HL ;F4AB 22 07 E6 F4AE: LD HL,E609 ;F4AE 21 09 E6 LD E,A ;F4B1 5F LD D,00 ;F4B2 16 00 ADD HL,DE ;F4B4 19 LD (HL),C ;F4B5 71 INC A ;F4B6 3C LD (E606),A ;F4B7 32 06 E6 LD A,(crtcol) ;F4BA 3A 05 E6 INC A ;F4BD 3C LD (crtcol),A ;F4BE 32 05 E6 AND 0F ;F4C1 E6 0F JP NZ,F4DA ;F4C3 C2 DA F4 LD HL,(E607) ;F4C6 2A 07 E6 LD A,(E606) ;F4C9 3A 06 E6 EI ;F4CC FB LD C,A ;F4CD 4F LD B,00 ;F4CE 06 00 ADD HL,BC ;F4D0 09 LD A,H ;F4D1 7C CP F0 ;F4D2 FE F0 JP NZ,F4DA ;F4D4 C2 DA F4 CALL F532 ;F4D7 CD 32 F5 F4DA: EI ;F4DA FB LD HL,E707 ;F4DB 21 07 E7 BIT 1,(HL) ;F4DE CB 4E RET NZ ;F4E0 C0 LD A,(crtcol) ;F4E1 3A 05 E6 CP maxcol ;F4E4 FE 50 ; q. last column? RET NZ ;F4E6 C0 DEC A ;F4E7 3D LD (crtcol),A ;F4E8 32 05 E6 JP F60C ;F4EB C3 0C F6 ;---------------------------------------- ; F4EE: LD HL,0000 ;F4EE 21 00 00 LD A,(crtrow) ;F4F1 3A 04 E6 LD BC,0050 ;F4F4 01 50 00 OR A ;F4F7 B7 JP Z,F500 ;F4F8 CA 00 F5 F4FB: ADD HL,BC ;F4FB 09 DEC A ;F4FC 3D JP NZ,F4FB ;F4FD C2 FB F4 F500: LD C,00 ;F500 0E 00 LD A,(crtcol) ;F502 3A 05 E6 CP maxcol ;F505 FE 50 ; q. last column? JP NZ,F50D ;F507 C2 0D F5 LD A,4F ;F50A 3E 4F INC C ;F50C 0C F50D: LD E,A ;F50D 5F LD D,00 ;F50E 16 00 ADD HL,DE ;F510 19 EX DE,HL ;F511 EB LD HL,(E600) ;F512 2A 00 E6 ADD HL,DE ;F515 19 LD A,14 ;F516 3E 0E OUT (CRT_ADDR),A ;F518 D3 84 ; select cursor high address LD A,H ;F51A 7C OUT (CRT_DATA),A ;F51B D3 85 LD A,15 ;F51D 3E 0F OUT (CRT_ADDR),A ;F51F D3 84 ; select cursor low address LD A,L ;F521 7D OUT (CRT_DATA),A ;F522 D3 85 ADD HL,BC ;F524 09 LD A,H ;F525 7C AND 07 ;F526 E6 07 LD H,A ;F528 67 LD (E602),HL ;F529 22 02 E6 LD HL,conmod ;F52C 21 59 E6 SET 7,(HL) ;F52F CB FE RET ;F531 C9 ;---------------------------------------- ; F532: LD A,(E606) ;F532 3A 06 E6 OR A ;F535 B7 JP NZ,F532 ;F536 C2 32 F5 LD HL,conmod ;F539 21 59 E6 RES 7,(HL) ;F53C CB BE RET ;F53E C9 ;---------------------------------------- ; F53F: XOR A ;F53F AF LD (crtcol),A ;F540 32 05 E6 JP F553 ;F543 C3 53 F5 ;---------------------------------------- ; F546: XOR A ;F546 AF LD (crtcol),A ;F547 32 05 E6 CALL F4EE ;F54A CD EE F4 LD A,(E707) ;F54D 3A 07 E7 BIT 0,A ;F550 CB 47 RET Z ;F552 C8 F553: LD HL,E707 ;F553 21 07 E7 F556: LD A,(crtrow) ;F556 3A 04 E6 CP 17h ;F559 FE 17 JP Z,F566 ;F55B CA 66 F5 INC A ;F55E 3C LD (crtrow),A ;F55F 32 04 E6 CALL F4EE ;F562 CD EE F4 RET ;F565 C9 F566: BIT 4,(HL) ;F566 CB 66 RET Z ;F568 C8 BIT 2,(HL) ;F569 CB 56 JP NZ,F576 ;F56B C2 76 F5 XOR A ;F56E AF LD (crtrow),A ;F56F 32 04 E6 CALL F4EE ;F572 CD EE F4 RET ;F575 C9 F576: LD DE,0780 ;F576 11 80 07 LD BC,0050 ;F579 01 50 00 JP F5DA ;F57C C3 DA F5 F57F: LD HL,E707 ;F57F 21 07 E7 F582: LD A,(crtcol) ;F582 3A 05 E6 OR A ;F585 B7 JP Z,F591 ;F586 CA 91 F5 DEC A ;F589 3D LD (crtcol),A ;F58A 32 05 E6 CALL F4EE ;F58D CD EE F4 RET ;F590 C9 F591: BIT 7,(HL) ;F591 CB 7E RET Z ;F593 C8 LD A,(crtrow) ;F594 3A 04 E6 OR A ;F597 B7 JP NZ,F5A3 ;F598 C2 A3 F5 BIT 6,(HL) ;F59B CB 76 JP Z,F5A3 ;F59D CA A3 F5 BIT 4,(HL) ;F5A0 CB 66 RET Z ;F5A2 C8 F5A3: LD A,4F ;F5A3 3E 4F LD (crtcol),A ;F5A5 32 05 E6 BIT 6,(HL) ;F5A8 CB 76 JP NZ,F5B4 ;F5AA C2 B4 F5 CALL F4EE ;F5AD CD EE F4 RET ;F5B0 C9 ;---------------------------------------- ; ; ESC I - cursor up and scroll down if at top ; ESCCURUPSCR: LD HL,E707 ;F5B1 21 07 E7 F5B4: LD A,(crtrow) ;F5B4 3A 04 E6 OR A ;F5B7 B7 JP Z,F5C3 ;F5B8 CA C3 F5 DEC A ;F5BB 3D LD (crtrow),A ;F5BC 32 04 E6 CALL F4EE ;F5BF CD EE F4 RET ;F5C2 C9 ;---------------------------------------- F5C3: BIT 4,(HL) ;F5C3 CB 66 RET Z ;F5C5 C8 BIT 3,(HL) ;F5C6 CB 5E JP NZ,F5D4 ;F5C8 C2 D4 F5 LD A,17 ;F5CB 3E 17 LD (crtrow),A ;F5CD 32 04 E6 CALL F4EE ;F5D0 CD EE F4 RET ;F5D3 C9 F5D4: LD DE,FFB0 ;F5D4 11 B0 FF LD BC,FFB0 ;F5D7 01 B0 FF F5DA: LD HL,(E600) ;F5DA 2A 00 E6 ADD HL,DE ;F5DD 19 LD A,H ;F5DE 7C AND 07 ;F5DF E6 07 OR E8 ;F5E1 F6 E8 LD H,A ;F5E3 67 LD DE,0050 ;F5E4 11 50 00 PUSH BC ;F5E7 C5 CALL F71A ;F5E8 CD 1A F7 CALL F532 ;F5EB CD 32 F5 POP BC ;F5EE C1 LD HL,(E600) ;F5EF 2A 00 E6 ADD HL,BC ;F5F2 09 LD A,H ;F5F3 7C AND 07 ;F5F4 E6 07 LD H,A ;F5F6 67 LD (E600),HL ;F5F7 22 00 E6 LD A,12 ;F5FA 3E 0C OUT (CRT_ADDR),A ;F5FC D3 84 ; select high start register LD A,H ;F5FE 7C OUT (CRT_DATA),A ;F5FF D3 85 LD A,13 ;F601 3E 0D OUT (CRT_ADDR),A ;F603 D3 84 ; select low start register LD A,L ;F605 7D OUT (CRT_DATA),A ;F606 D3 85 CALL F4EE ;F608 CD EE F4 RET ;F60B C9 F60C: LD HL,E707 ;21 07 E7 F60F: LD A,(crtcol) ;F60F 3A 05 E6 CP 4F ;F612 FE 4F JP NC,F61F ;F614 D2 1F F6 INC A ;F617 3C LD (crtcol),A ;F618 32 05 E6 CALL F4EE ;F61B CD EE F4 RET ;F61E C9 F61F: BIT 7,(HL) ;F61F CB 7E RET Z ;F621 C8 LD A,(crtrow) ;F622 3A 04 E6 CP 17 ;F625 FE 17 JP NZ,F632 ;F627 C2 32 F6 BIT 5,(HL) ;F62A CB 6E JP Z,F632 ;F62C CA 32 F6 BIT 4,(HL) ;F62F CB 66 RET Z ;F631 C8 F632: LD A,(crtcol) ;F632 3A 05 E6 SUB 4F ;F635 D6 4F LD (crtcol),A ;F637 32 05 E6 BIT 5,(HL) ;F63A CB 6E JP NZ,F556 ;F63C C2 56 F5 CALL F4EE ;F63F CD EE F4 RET ;F642 C9 ;---------------------------------------- ; ; ESC A - cursor up ; ESCCURUP: LD HL,E71C ;F643 21 1C E7 JP F5B4 ;F646 C3 B4 F5 ;---------------------------------------- ; ; ESC B - cursor down ; ESCCURDOWN: LD HL,E71C ;F649 21 1C E7 JP F556 ;F64C C3 56 F5 ;---------------------------------------- ; ; ESC D - cursor left ; ESCCURLEFT: LD HL,E71C ;F64F 21 1C E7 JP F582 ;F652 C3 82 F5 ;---------------------------------------- ; ; ESC C - cursor right ; ESCCURRIGHT: LD HL,E71C ;F655 21 1C E7 JP F60F ;F658 C3 0F F6 ;---------------------------------------- ; ; ESC Y - position cursor ; ESCPOSCUR: LD HL,F662 ;F65B 21 62 F6 LD (conhdl),HL ;F65E 22 5A E6 ; set conout handler RET ;F661 C9 F662: LD HL,F682 ;F662 21 82 F6 LD (conhdl),HL ;F665 22 5A E6 ; set conout handler LD A,C ;F668 79 SUB 20 ;F669 D6 20 JP P,F66F ;F66B F2 6F F6 XOR A ;F66E AF F66F: CP 18 ;F66F FE 18 JP C,F676 ;F671 DA 76 F6 LD A,17 ;F674 3E 17 F676: LD (crtrow),A ;F676 32 04 E6 CALL F4EE ;F679 CD EE F4 LD HL,conmod ;F67C 21 59 E6 SET 7,(HL) ;F67F CB FE RET ;F681 C9 F682: LD HL,F401 ;F682 21 01 F4 LD (conhdl),HL ;F685 22 5A E6 ; set conout handler LD A,C ;F688 79 SUB 20 ;F689 D6 20 JP P,F68F ;F68B F2 8F F6 XOR A ;F68E AF F68F: CP 50 ;F68F FE 50 JP C,F696 ;F691 DA 96 F6 LD A,4F ;F694 3E 4F F696: LD (crtcol),A ;F696 32 05 E6 CALL F4EE ;F699 CD EE F4 LD HL,conmod ;F69C 21 59 E6 SET 7,(HL) ;F69F CB FE RET ;F6A1 C9 ;---------------------------------------- ; ; ESC E - clear screen ; ESCCLS: CALL ESCHOMECUR ;F6A2 CD F2 F6 ; home cursor LD HL,(E600) ;F6A5 2A 00 E6 LD A,H ;F6A8 7C AND 07 ;F6A9 E6 07 OR E8 ;F6AB F6 E8 LD H,A ;F6AD 67 LD DE,0780 ;F6AE 11 80 07 JP F71A ;F6B1 C3 1A F7 ;---------------------------------------- ; ; ESC J - erase to end of screen ; ESCERASEEOS: CALL F532 ;F6B4 CD 32 F5 LD A,(crtrow) ;F6B7 3A 04 E6 LD C,A ;F6BA 4F LD A,18 ;F6BB 3E 18 SUB C ;F6BD 91 LD DE,0050 ;F6BE 11 50 00 LD HL,FFB0 ;F6C1 21 B0 FF ESCERASEEOS2: ADD HL,DE ;F6C4 19 DEC A ;F6C5 3D JP NZ,ESCERASEEOS2 ;F6C6 C2 C4 F6 LD A,(crtcol) ;F6C9 3A 05 E6 LD C,A ;F6CC 4F LD A,maxcol ;F6CD 3E 50 SUB C ;F6CF 91 LD E,A ;F6D0 5F LD D,00 ;F6D1 16 00 ADD HL,DE ;F6D3 19 EX DE,HL ;F6D4 EB JP ESCERASEEOL2 ;F6D5 C3 E6 F6 ;---------------------------------------- ; ; ESC K - erase to end of line ; ESCERASEEOL: CALL F532 ;F6D8 CD 32 F5 LD A,(crtcol) ;F6DB 3A 05 E6 LD C,A ;F6DE 4F LD A,maxcol ;F6DF 3E 50 SUB C ;F6E1 91 RET Z ;F6E2 C8 LD E,A ;F6E3 5F LD D,00 ;F6E4 16 00 ESCERASEEOL2: LD HL,(E602) ;F6E6 2A 02 E6 LD A,H ;F6E9 7C AND 07 ;F6EA E6 07 OR E8 ;F6EC F6 E8 LD H,A ;F6EE 67 JP F71A ;F6EF C3 1A F7 ;---------------------------------------- ; ; ESC H - home cursor ; ESCHOMECUR: XOR A ;F6F2 AF LD (crtcol),A ;F6F3 32 05 E6 LD (crtrow),A ;F6F6 32 04 E6 CALL F4EE ;F6F9 CD EE F4 RET ;F6FC C9 ;---------------------------------------- ; ; ESC X - erase line ; ESCERASELINE: LD DE,0050 ;F6FD 11 50 00 LD HL,FFB0 ;F700 21 B0 FF LD A,(crtrow) ;F703 3A 04 E6 INC A ;F706 3C F707: ADD HL,DE ;F707 19 DEC A ;F708 3D JP NZ,F707 ;F709 C2 07 F7 EX DE,HL ;F70C EB LD HL,(E600) ;F70D 2A 00 E6 ADD HL,DE ;F710 19 LD A,H ;F711 7C AND 07 ;F712 E6 07 OR E8 ;F714 F6 E8 LD H,A ;F716 67 LD DE,0050 ;F717 11 50 00 F71A: PUSH HL ;F71A E5 CALL F532 ;F71B CD 32 F5 LD HL,E609 ;F71E 21 09 E6 LD C,20 ;F721 0E 20 LD B,50 ;F723 06 50 F725: LD (HL),C ;F725 71 INC HL ;F726 23 DEC B ;F727 05 JP NZ,F725 ;F728 C2 25 F7 POP HL ;F72B E1 F72C: LD A,D ;F72C 7A OR E ;F72D B3 JP Z,F770 ;F72E CA 70 F7 PUSH HL ;F731 E5 PUSH DE ;F732 D5 EX DE,HL ;F733 EB CALL F532 ;F734 CD 32 F5 LD HL,F000 ;F737 21 00 F0 OR A ;F73A B7 SBC HL,DE ;F73B ED 52 LD C,50 ;F73D 0E 50 LD A,H ;F73F 7C OR A ;F740 B7 JP NZ,F74A ;F741 C2 4A F7 LD A,L ;F744 7D CP C ;F745 B9 JP NC,F74A ;F746 D2 4A F7 LD C,A ;F749 4F F74A: POP DE ;F74A D1 POP HL ;F74B E1 LD A,D ;F74C 7A OR A ;F74D B7 JP NZ,F757 ;F74E C2 57 F7 LD A,E ;F751 7B CP C ;F752 B9 JP NC,F757 ;F753 D2 57 F7 LD C,A ;F756 4F F757: LD (E607),HL ;F757 22 07 E6 LD A,C ;F75A 79 LD (E606),A ;F75B 32 06 E6 EI ;F75E FB EX DE,HL ;F75F EB LD B,00 ;F760 06 00 OR A ;F762 B7 SBC HL,BC ;F763 ED 42 EX DE,HL ;F765 EB ADD HL,BC ;F766 09 LD A,H ;F767 7C AND 07h ;F768 E6 07 ; ? 0000,0111 OR 0E8h ;F76A F6 E8 ; ? 1110,1000 LD H,A ;F76C 67 JP F72C ;F76D C3 2C F7 F770: CALL F4EE ;F770 CD EE F4 RET ;F773 C9 ;---------------------------------------- ; ; point conout handler to escape codes handling routine ; F774: LD HL,F3EF ;F774 21 EF F3 LD (conhdl),HL ;F777 22 5A E6 ; set conout handler RET ;F77A C9 ;---------------------------------------- ; ; sound the bell ; SOUNDBELL: IN A,(AUX_CNTL) ;F77B DB 94 ; read auxillary control port RES 6,A ;F77D CB B7 OUT (AUX_CNTL),A ;F77F D3 94 ; turn buzzer on SET 6,A ;F781 CB F7 OUT (AUX_CNTL),A ;F783 D3 94 ; turn buzzer off RET ;F785 C9 ;---------------------------------------- ; ; ESC F - graphics mode ; ESCGRAPHIC: LD HL,conmod ;F786 21 59 E6 ; console mode SET 6,(HL) ;F789 CB F6 ; set bit 6 RET ;F78B C9 ;---------------------------------------- ; ; ESC G - ascii mode ; ESCASCII: LD HL,conmod ;F78C 21 59 E6 ; console mode RES 6,(HL) ;F78F CB B6 ; clear bit 6 RET ;F791 C9 ;---------------------------------------- ; ; ESC R - toggle inverse video ; ESCTOGGLEINV: LD HL,conmod ;F792 21 59 E6 LD A,(HL) ;F795 7E ; get console mode XOR 20 ;F796 EE 20 ; toggle bit 6 LD (HL),A ;F798 77 ; store it back RET ;F799 C9 ;---------------------------------------- ; ; F79A: db 0,0,0,0,0,0 ;F79A F7A0: db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;F7A0 F7B0: db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;F7B0 F7C0: db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;F7C0 F7D0: db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;F7D0 F7E0: db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;F7E0 F7F0: db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;F7E0 F7FF: db 0A0h ;F7FF A0 ; prom checksum ;----------------------------------------