; ; reverse engineer of Kaypro II 81-232 ROM (4k) ; cr equ 0dh lf equ 0ah esc equ 1bh clr equ 1ah bs equ 8 fs equ 0ch rlf equ 0bh eol equ 18h eos equ 17h homec equ 1eh ; org 0 JP start JP diskinit JP vidinit JP devinit JP home JP seldsk JP settrk JP setsec JP setdma JP read JP write JP sectran JP diskon JP diskoff JP kbdstat JP kbdin JP kbdout JP ttystat JP ttyin JP ttyout JP liststat JP list JP ttyostat JP vidout JP thnsd start: DI LD SP,stack LD B,10 CALL thnsd CALL devinit CALL vidinit CALL diskinit JR bootsys DEC A JP 2B3BH XOR A LD (0C913H),A bootsys: CALL print db esc,'=*?' db '* KAYPRO *' db esc,'=-4' db ' Please place your' db ' diskette into Drive' db ' A',8,0 LD C,0 CALL seldsk LD BC,0 CALL settrk LD C,0 CALL setsec LD BC,0FA00H CALL setdma CALL read DI OR A JR NZ,booterr LD BC,(0FA02H) LD (dmaadr),BC LD BC,(0FA04H) PUSH BC LD BC,(0FA06H) LD B,C LD C,1 cb1: PUSH BC CALL setsec CALL read DI POP BC OR A JR NZ,booterr LD HL,(dmaadr) LD DE,80H ADD HL,DE LD (dmaadr),HL DEC B RET Z INC C LD A,40 CP C JR NZ,cb1 LD C,16 PUSH BC LD BC,1 CALL settrk POP BC JR cb1 booterr: CALL print db lf,cr,lf,cr,7 db 'I cannot read your' db ' diskette.',0 CALL diskoff self: JR self dph0: dw 0,0,0,0 dw 0ff6dh,0feaah dw 0fe20h,0fe30h db 0 dw 0,0,0,0 dw 0ff6dh,0feaah dw 0fe4ah,0fe5ah db 0 dk1dph: dw 18 db 3 db 7 db 0 dw 52h dw 1fh db 80h db 0 dw 8 dw 3 dk2dph: dw 40 db 3 db 7 db 0 dw 0c2h dw 3fh db 0f0h db 0 dw 16 dw 1 db 1,6,11,16,3,8,13,18 db 5,10,15,2,7,12,17,4,9,14 dk3dph: dw 40 db 4 db 15 db 1 dw 0C4H dw 3fh db 0c0h db 0 dw 16 dw 1 diskinit: LD HL,ioimage LD DE,0FED1H LD BC,87H LDIR LD HL,dph0 LD DE,0FE79H LD BC,52H LDIR XOR A LD (hstact),A LD (unacnt),A LD A,0 LD (tracka),A LD A,0FFH LD (dsk),A LD (csva),A LD (0FE1DH),A RET seldsk: LD A,C LD (sekdsk),A JP dsksel setsec: LD A,C LD (seksec),A LD A,(tracka) OR A JP NZ,secset RET setdma: LD (dmaadr),BC RET settrk: LD (sektrk),BC LD A,(tracka) OR A JP NZ,trkset RET home: LD A,(tracka) OR A JP NZ,dohome LD A,(hstwrt) OR A JP NZ,homed LD (hstact),A homed: JP dohome read: LD A,(tracka) OR A JP NZ,0FEE0H XOR A LD (unacnt),A LD A,1 LD (readop),A LD (rsflag),A LD A,2 LD (wrtype),A JP rwoper write: LD A,(tracka) OR A JP NZ,0FEF1H XOR A LD (readop),A LD A,C LD (wrtype),A CP 2 JP NZ,chkuna LD A,8 LD (unacnt),A LD A,(sekdsk) LD (unadsk),A LD HL,(sektrk) LD (unatrk),HL LD A,(seksec) LD (unasec),A chkuna: LD A,(unacnt) OR A JP Z,alloc DEC A LD (unacnt),A LD A,(sekdsk) LD HL,unadsk CP (HL) JP NZ,alloc LD HL,unatrk CALL sektrkcmp JP NZ,alloc LD A,(seksec) LD HL,unasec CP (HL) JP NZ,alloc INC (HL) LD A,(HL) CP 40 JP C,noovf LD (HL),0 LD HL,(unatrk) INC HL LD (unatrk),HL noovf: XOR A LD (rsflag),A JP rwoper alloc: XOR A LD (unacnt),A INC A LD (rsflag),A rwoper: XOR A LD (erflag),A LD A,(seksec) OR A RRA OR A RRA LD (sekhst),A LD HL,hstact LD A,(HL) LD (HL),1 OR A JP Z,filhst LD A,(sekdsk) LD HL,hstdsk CP (HL) JP NZ,nomatch LD HL,hsttrk CALL sektrkcmp JP NZ,nomatch LD A,(sekhst) LD HL,hstsec CP (HL) JP Z,match nomatch: LD A,(hstwrt) OR A CALL NZ,writehst filhst: LD A,(sekdsk) LD (hstdsk),A LD HL,(sektrk) LD (hsttrk),HL LD A,(sekhst) LD (hstsec),A LD A,(rsflag) OR A CALL NZ,readhst XOR A LD (hstwrt),A match: LD A,(seksec) AND 3 LD L,A LD H,0 ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL LD DE,hstbuf ADD HL,DE LD DE,(dmaadr) LD BC,80H LD A,(readop) OR A JR NZ,rwmove LD A,1 LD (hstwrt),A EX DE,HL rwmove: CALL 0FED1H LD A,(wrtype) CP 1 LD A,(erflag) RET NZ OR A RET NZ XOR A LD (hstwrt),A CALL writehst LD A,(erflag) RET sektrkcmp: EX DE,HL LD HL,sektrk LD A,(DE) CP (HL) RET NZ INC DE INC HL LD A,(DE) CP (HL) RET dsksel: LD HL,0 LD A,C CP 2 RET NC OR A LD HL,0FE79H JR Z,sel0 LD HL,0FE8AH sel0: LD A,(dsk) CP C RET Z LD A,C LD (dsk),A OR A PUSH HL LD HL,denflag LD DE,0FE1DH JR Z,sel1 LD DE,csva sel1: LD A,(DE) CP 0FFH JR Z,selnot PUSH BC LD BC,3 LDIR POP BC LD DE,denflag selnot: LD A,C OR A LD HL,csva JR Z,sel2 LD HL,0FE1DH sel2: LD A,(HL) CP 0FFH JR Z,sel3 LD BC,3 LDIR LD BC,0FH LD DE,0FEAAH LD HL,dk2dph LD A,(trackb) OR A JR Z,sel2a LD HL,dk3dph sel2a: LDIR LD A,(denflag) OUT (11H),A POP HL RET sel3: POP HL LD A,0 LD (tracka),A CALL ready CALL home CALL dens2 JR Z,dend LD A,20H LD (tracka),A CALL ready CALL dens2 RET NZ JR dens dend: PUSH HL PUSH DE LD DE,0 LD (HL),E INC HL LD (HL),D LD DE,9 ADD HL,DE LD DE,0FEAAH LD (HL),E INC HL LD (HL),D IN A,(1CH) OR 4 OUT (1CH),A CALL dens2 LD BC,0FH LD DE,0FEAAH LD HL,dk2dph LD A,0 JR NZ,dend1 LD A,(move) CP 0AH LD A,0 JR C,dend1 LD HL,dk3dph LD A,0FFH dend1: LD (trackb),A LDIR IN A,(1CH) AND 0FBH OUT (1CH),A JR dens0 dens: PUSH HL PUSH DE LD DE,0FEB9H LD (HL),E INC HL LD (HL),D LD DE,9 ADD HL,DE LD DE,0FE9BH LD (HL),E INC HL LD (HL),D dens0: LD HL,denflag LD DE,csva LD A,(dsk) OR A JR Z,dens1 LD DE,0FE1DH dens1: PUSH BC LD BC,3 LDIR POP BC POP DE POP HL RET dens2: PUSH HL PUSH BC LD HL,0FECBH LD BC,613H LD A,0C4H OUT (10H),A dens3: HALT INI JR NZ,dens3 CALL busy BIT 4,A POP BC POP HL RET dohome: CALL ready IN A,(1CH) AND 0FBH OUT (1CH),A XOR A LD (denflag),A LD A,0 OUT (10H),A JR busy trkset: CALL ready LD A,(trackb) OR A JR Z,trks3 LD A,C RRA LD C,A IN A,(1CH) JR C,trks1 AND 0FBH JR trks2 trks1: OR 4 trks2: OUT (1CH),A trks3: LD A,C LD (denflag),A OUT (13H),A LD A,10H OUT (10H),A JR busy secset: IN A,(1CH) BIT 2,A LD A,C JR Z,scst1 ADD A,0AH scst1: OUT (12H),A RET sectran: LD A,D OR E LD H,B LD L,C RET Z EX DE,HL ADD HL,BC LD L,(HL) LD H,0 RET ready: PUSH HL PUSH DE PUSH BC LD A,0D0H OUT (10H),A CALL diskon LD A,(dsk) LD E,A IN A,(1CH) AND 0DCH OR E INC A LD HL,tracka OR (HL) OUT (1CH),A POP BC POP DE POP HL RET diskon: IN A,(1CH) BIT 6,A RET Z RES 6,A OUT (1CH),A LD B,32H CALL thnsd RET diskoff: IN A,(1CH) SET 6,A OUT (1CH),A RET thnsd: LD DE,686H tlp: DEC DE LD A,D OR E JP NZ,tlp DJNZ thnsd RET busy: HALT bsy: IN A,(10H) BIT 0,A JR NZ,bsy RET writehst: LD L,3 wrthst0: LD DE,40FH wrthst: PUSH HL PUSH DE CALL hstcom CALL 0FEF8H POP DE POP HL JR Z,wrthst1 DEC E JR NZ,wrthst DEC D JR Z,wrthst4 CALL dohome LD E,0FH JR wrthst wrthst1: LD B,0 LD A,88H OUT (10H),A wrthst2: HALT IN A,(13H) DJNZ wrthst2 wrthst3: HALT IN A,(13H) DJNZ wrthst3 CALL busy AND 9CH wrthst4: LD (erflag),A RET Z DEC L JR NZ,wrthst0 LD A,0FFH JR wrthst4 readhst: LD DE,40FH rdhst: PUSH DE CALL hstcom CALL 0FEE7H LD (erflag),A POP DE RET Z DEC E JR NZ,rdhst DEC D RET Z CALL dohome LD E,0FH JR rdhst hstcom: LD A,(hstdsk) LD C,A CALL dsksel LD BC,(hsttrk) CALL trkset LD A,(hstsec) LD C,A CALL secset RET ; ; move next 87h bytes to FED1H ; ioimage: ;move: IN A,(1CH) ;0fed1h RES 7,A ;0fed3h OUT (1CH),A ;0fed5h LDIR ;0fed7h IN A,(1CH) ;0fed9h SET 7,A ;0fedbh OUT (1CH),A ;0feddh RET ;0fedfh ;rd128: LD HL,(dmaadr) ;0fee0h LD B,1 ;0fee3h JR rd ;0fee5h ;rd512: LD HL,hstbuf ;0fee7h LD B,4 ;0feeah rd: LD DE,9C88H ;0feech JR action ;0feefh ;wrt128: LD HL,(dmaadr) ;0fef1h LD B,1 ;0fef4h JR wrt ;0fef6h ;wrt512: LD HL,hstbuf ;0fef8h LD B,4 ;0fefbh wrt: LD DE,0FCACH ;0fefdh action: CALL ready ;0ff00h DI ;0ff03h IN A,(1CH) ;0ff04h RES 7,A ;0ff06h OUT (1CH),A ;0ff08h PUSH HL ;0ff0ah LD HL,66H ;0ff0bh LD A,(HL) ;0ff0eh EX AF,AF' ;0ff0fh LD (HL),0C9H ;0ff10h POP HL ;0ff12h LD A,B ;0ff13h LD BC,8013H ;0ff14h BIT 0,A ;0ff17h JR NZ,actn ;0ff19h LD B,0 ;0ff1bh actn: CP 1 ;0ff1dh PUSH AF ;0ff1fh LD A,E ;0ff20h CP 0ACH ;0ff21h JR Z,wstart ;0ff23h OUT (10H),A ;0ff25h POP AF ;0ff27h JR Z,r12 ;0ff28h r11: HALT ;0ff2ah INI ;0ff2bh JR NZ,r11 ;0ff2dh r12: HALT ;0ff2fh INI ;0ff30h JR NZ,r12 ;0ff31h JR done ;0ff33h wstart: OUT (10H),A ;0ff35h POP AF ;0ff37h JR Z,w12 ;0ff38h w11: HALT ;0ff3ah OUTI ;0ff3bh JR NZ,w11 ;0ff3dh w12: HALT ;0ff3fh OUTI ;0ff40h JR NZ,w12 ;0ff42h done: EX AF,AF' ;0ff44h LD (66H),A ;0ff45h IN A,(1CH) ;0ff48h SET 7,A ;0ff4ah OUT (1CH),A ;0ff4ch EI ;0ff4eh CALL busy ;0ff4fh AND D ;0ff52h RET Z ;0ff53h LD A,1 ;0ff54h RET ;0ff56h ; ; end of copy ; iotabint: db 28 db 7,18h db 0ch,5 db 7,4 db 7,44h db 7,3 db 7,0c1h db 7,5 db 7,0e8h db 7,1 db 7,0 db 6,18H db 0,5 db 6,4 db 6,44h db 6,3 db 6,0e1h db 6,5 db 6,0e8h db 6,1 db 6,0 db 1dh,3 db 1ch,81h db 1dh,0cfh db 1dh,8 db 9,3 db 9,0fh db 0bh,3 db 0bh,4fh devinit: LD HL,iotabint LD B,(HL) iolp: INC HL LD C,(HL) INC HL LD A,(HL) OUT (C),A DJNZ iolp RET kbdstat: IN A,(7) AND 1 RET Z LD A,0FFH RET kbdin: CALL kbdstat JR Z,kbdin IN A,(5) CALL kbdmap RET kbdout: IN A,(7) AND 4 JR Z,kbdout LD A,C OUT (5),A RET kbdmap: LD HL,mapin LD BC,19 CPIR RET NZ LD DE,mapin OR A SBC HL,DE LD DE,mapout-1 ADD HL,DE LD A,(HL) RET mapin: db 0f1h,0f2h,0f3h,0f4h db 0b1h,0c0h,0c1h,0c2h db 0d0h,0d1h,0d2h db 0e1h,0e2h,0e3h,0e4h db 0d3h,0c3h,0b2h db 0ffh mapout: db 80h,81h,82h,83h,84h,85h db 86h,87h,88h,89h,8ah,8bh db 8ch,8dh,8eh,8fh,90h,91h ttystat: IN A,(6) AND 1 JR comout ttyin: CALL ttystat JR Z,ttyin IN A,(4) RET ttyout: IN A,(6) AND 4 JR Z,ttyout LD A,C OUT (4),A RET ttyostat: IN A,(6) AND 4 JR comout liststat: IN A,(1CH) BIT 3,A comout: RET Z LD A,0FFH RET list: CALL liststat JR Z,list LD A,C OUT (8),A IN A,(1CH) SET 4,A OUT (1CH),A RES 4,A OUT (1CH),A RET vidinit: LD A,20H LD (0FE75H),A CALL clear LD (0FE76H),HL XOR A LD (0FE74H),A LD A,17H OUT (14H),A LD A,7FH LD (0FE78H),A RET vidout: LD A,(0FE74H) OR A JP NZ,leadin LD A,7 CP C JR NZ,nobell LD C,4 JP kbdout nobell: CALL clrcur LD DE,finsh PUSH DE LD A,C CP lf JR Z,lfcd CP cr JP Z,return CP bs JR Z,back CP fs JR Z,fowrd CP rlf JR Z,up CP esc JP Z,doesc CP eol JP Z,cleol CP eos JR Z,cleos CP clr JR Z,clear CP homec JR Z,hmcsr CP 60H JR C,vout LD A,(0FE78H) AND C vout: LD (HL),A INC HL LD A,L AND 7FH CP 50H RET C CALL return JR lfcd vovr: LD DE,3BFFH LD A,D CP H JR C,scroll RET NZ LD A,E CP L RET NC scroll: LD B,17H LD HL,3080H LD DE,3000H scr1: PUSH BC LD BC,50H LDIR LD BC,30H ADD HL,BC EX DE,HL ADD HL,BC EX DE,HL POP BC DJNZ scr1 LD HL,3B80H JR cleol lfcd: LD DE,80H ADD HL,DE JR vovr back: LD A,L AND 7FH RET Z DEC HL RET fowrd: LD A,L AND 7FH CP 4FH RET NC INC HL RET up: PUSH HL LD DE,0FF80H ADD HL,DE PUSH HL OR A LD DE,3000H SBC HL,DE POP HL POP DE RET NC EX DE,HL RET clear: LD HL,3000H LD DE,3001H LD BC,0BFFH LD (HL),' ' LDIR LD HL,3000H RET hmcsr: LD HL,3000H RET cleos: PUSH HL CALL cleol LD DE,80H LD A,L AND 80H LD L,A ADD HL,DE LD A,3CH CP H JR Z,cleos1 LD E,L LD D,H OR A LD HL,3BFFH SBC HL,DE LD C,L LD B,H LD H,D LD L,E INC DE LD (HL),' ' LDIR cleos1: POP HL RET cleol: LD A,L AND 7FH CP 4FH JR C,cleol1 LD (HL),' ' RET cleol1: PUSH HL PUSH HL LD A,L AND 80H LD L,A LD DE,4FH ADD HL,DE POP DE PUSH DE OR A SBC HL,DE LD C,L LD B,H POP HL LD E,L LD D,H INC DE LD (HL),' ' LDIR POP HL RET clrcur: LD HL,(0FE76H) LD A,(HL) CP 0DFH LD A,' ' JR NZ,clr1 LD (HL),A clr1: RES 7,(HL) RET return: LD A,L AND 80H LD L,A RET doesc: LD A,1 LD (0FE74H),A RET leadin: LD HL,exit PUSH HL LD HL,0FE74H LD (HL),0 CP 1 JR NZ,l1 LD A,C RES 7,A CP 'G' JR Z,dogreek CP 'A' JR Z,doascii CP 'R' JR Z,dodel CP 'E' JR Z,doinst CP '=' RET NZ LD (HL),2 RET l1: CP 2 JR NZ,l2 LD A,C LD (0FE75H),A LD (HL),3 RET l2: CP 3 RET NZ CALL clrcur POP HL LD HL,3000H LD A,C SUB 20H l3: SUB 50H JR NC,l3 ADD A,50H LD L,A LD A,(0FE75H) SUB 20H l4: SUB 18H JR NC,l4 ADD A,18H LD DE,80H l5: JP Z,finsh ADD HL,DE DEC A JR l5 finsh: LD A,(HL) CP ' ' JR NZ,fin1 LD A,0DFH fin1: SET 7,A LD (HL),A LD (0FE76H),HL exit: RET dogreek: LD A,1FH LD (0FE78H),A RET doascii: LD A,7FH LD (0FE78H),A RET dodel: POP HL CALL setup PUSH DE JR Z,delscr LDIR delscr: LD HL,3B80H CALL cleol POP HL JR finsh doinst: POP HL CALL setup PUSH DE JR Z,inscr LD DE,3BFFH LD HL,3B7FH LDDR inscr: POP HL PUSH HL CALL cleol POP HL JR finsh setup: CALL clrcur CALL return PUSH HL EX DE,HL LD HL,3B80H OR A SBC HL,DE LD B,H LD C,L POP HL PUSH HL LD DE,80H ADD HL,DE POP DE LD A,B OR C RET print: EX (SP),HL LD A,(HL) INC HL EX (SP),HL OR A RET Z LD C,A CALL vidout JR print ramscratch equ 0fc00h sekdsk equ ramscratch sektrk equ sekdsk+1 seksec equ sektrk+2 hstdsk equ seksec+1 hsttrk equ hstdsk+1 hstsec equ hsttrk+2 sekhst equ hstsec+1 hstact equ sekhst+1 hstwrt equ hstact+1 unacnt equ hstwrt+1 unadsk equ unacnt+1 unatrk equ unadsk+1 unasec equ unatrk+2 erflag equ unasec+1 rsflag equ erflag+1 readop equ rsflag+1 wrtype equ readop+1 dmaadr equ wrtype+1 hstbuf equ dmaadr+2 dsk equ hstbuf+512 denflag equ dsk+1 tracka equ denflag+1 trackb equ tracka+1 csva equ trackb+1 alva equ csva+16 csvb equ alva+25 alvb equ csvb+16 leadflg equ alvb+25 row equ leadflg+1 cursor equ row+1 chrmsk equ cursor+2 dpha equ chrmsk+1 dphb equ dpha+17 dpbs equ dphb+17 dpbd equ dpbs+15 tbl1 equ dpbd+15 tbl2 equ tbl1+18 move equ tbl2+10 rd128 equ move+15 rd512 equ rd128+7 wrt128 equ rd512+10 wrt512 equ wrt128+7 rdwrtend equ rd128+150 dirbuf equ rdwrtend+1 stack equ 0ffffh END