%NOINCL __BIOS EQU INCLUDE biosdata.mac %INCL .XCREF B_D EQU 400h .MODEL small .CODE ORG 0E000h ASSUME DS:ABS0,ES:ABS0 sCopyright db 'POISK BIOS Version 1.0.1 ALPHA ' db 'Copyright (c) Ufasoft corp. 1994',10 db 'model 1.3 2764-0001-940702',10,0 Reset: cli cld in AL,28h mov AL,89h out 63h,AL mov AL,88h out 68h,AL in AL,28h mov AL,83h out 6Bh,AL mov BX,403h call Beep mov DS,CS mov BX,0E000h mov CX,2000h call CheckSum jnz FatalError clr DI mov DS,DI @@a: Mov BY [DI],0 cmp BY [DI],0 jne FatalError Mov BY [DI],0FFh cmp BY [DI],0FFh jne FatalError inc DI cmp DI,800h jnz @@a clr ES_AX mov SS,AX mov SP,800h mov DS,CS xchg AX,DI lea SI,tISR mov CX,32h @@c: movsw mov AX,CS stosw loop @@c Mov ES:[43h*4],OFFSET tCharGenerator mov ES:[43h*4+2],CS mov DI,400h ;Clear BIOS Data Area clr AX mov CX,100h rep stosb mov bKbBeepFlag,1 mov pKbBufHead,01Eh mov pKbBufTail,01Eh Mov BY wEquipment,2Ch mov AL,13h ;Init PIC 8259A out 20h,AL mov AL,8 out 21h,AL mov AL,9 out 21h,AL mov AL,0FEh out 21h,AL ;Enable only Timer 0 int mov AL,36h ;Init PIT 8254 out 43h,AL clr AL out 40h,AL out 40h,AL mov AX,3 int 10h mov ES,CS lea BP,sCopyright mov AX,1301h cwd mov DS,DX mov CX,90 clr BH int 10h mov DX,202h ;Test Game Adapter in AL,DX cmp AL,0Eh je @@d or BY wEquipment+1,10h @@d: in AL,85h ;Test Parallel Port cmp AL,0Eh je @@e or BY wEquipment+1,40h mov twLPTPort,85h mov DX,87h mov AL,88h out DX,AL @@e: mov DX,3FDh ;Test Serial Port 8250 in AL,DX cmp AL,0Eh je @@f mov twCOMPort,3F8h mov tbTimeOutCOM,10 or BY wEquipment+1,2 @@f: InitFDC: clr AH cwd call SelectDrive jnz @@d clr DI mov AX,101h call Pk @@a: inc DX call SelectDrive jnz @@d inc DI mov AX,4110h call Pk @@d: or BY wEquipment,AH ;Set Number of FDDs mov AX,1301h ;Type "Memory Size:" mov CX,30 mov DS,CS mov DX,200h lea BP,sMemorySize clr BH int 10h mov DI,800h @@i: mov DS,DI mov CX,4000h clr BX @@j: Mov BY [BX],0 cmp BY [BX],0 jne @@k Mov BY [BX],-1 cmp BY [BX],-1 jne @@k inc BX loop @@j add DI,400h mov AX,DI mov CL,6 shr AX,CL clr CX mov DS,CX mov wMemorySize,AX mov CL,10 div CL push AX cbw div CL push AX cbw div CL push AX mov AH,AL push AX mov BX,0401h call Beep clr BH mov DX,200h mov AH,2 int 10h mov CX,4 @@p: pop AX mov AL,AH add AL,30h mov AH,0Eh int 10h loop @@p cmp DI,0B400h ; !!! Must be 0B800h jne @@i @@k: mov AH,2 mov DH,3 clr BH int 10h mov DX,0F000h @@f: mov DS,DX clr BX cmp WO [BX],0AA55h jne @@g clr AH mov AL,[BX+2] mov CL,9 shl AX,CL push AX mov CL,4 shr AX,CL add DX,AX pop CX call CheckSum jz @@f2 push DX mov DX,2 call Beep @@f1: pop DX jmp @@h @@f2: push DX CS lea AX,@@f1 push AX DS mov AX,3 push AX retf @@g: add DX,20h @@h: cmp DX,0FE00h jb @@f int 19h int 18h jmp $ Pk: push AX clr AL out 0C0h,AL loop $ loop $ out 0C1h,AL mov AL,82 out 0C3h,AL mov AL,10h out 0C0h,AL in AL,0C4h @@l: in AL,0C0h test AL,1 jnz @@l mov CX,1 @@t: inc CX mov AL,60h out 0C0h,AL in AL,0C4h @@m: in AL,0C0h test AL,1 jnz @@m test AL,4 jz @@t mov tbFddTracks[DI],CL pop AX cmp CL,50 jb @@u or bFdCombine,AL @@u: ret FatalError: mov BX,101h call Beep loop $ loop $ mov BX,105h call Beep jmp $ TimerISR: call PushAll inc WO dTimerCount jnz @@a inc WO dTimerCount+2 @@a: cmp WO dTimerCount+2,18h jne @@b cmp WO dTimerCount,0B0h jne @@b Mov WO dTimerCount,AX Mov WO dTimerCount+2,AX mov bTimerOverflow,1 @@b: dec bCursorCount jnz @@c mov bCursorCount,4 call InvertCursor @@c: int 1Ch mov AL,0FFh out 60h,AL in AX,69h or AH,0F0h inc AX jnz @@d mov wLastKey,AX cmp AX,wLastKey1 je @@z @@d: mov wLastKey1,AX lea BX,twKbState lea DI,tbScanCode+95 mov DL,80h @@e: mov AL,DL out 60h,AL in AX,69h or AH,0F0h not AX cmp AX,[BX] jne @@f sub DI,12 jmp @@l @@f: mov SI,AX xor SI,[BX] mov [BX],AX mov CX,800h @@g: test SI,CX jz @@k test [BX],CX jz @@h mov wLastKey,DI mov bKeyTime,8 call SendCode jmp @@k @@h: cmp wLastKey,DI jne @@i mov wLastKey,0 @@i: mov AL,CS:[DI] mov AH,80h call PutScanCode @@k: dec DI shr CX,1 jnc @@g @@l: inc BX inc BX shr DL,1 jnc @@e mov DI,wLastKey jDIz @@z dec bKeyTime jnz @@z mov bKeyTime,2 call SendCode @@z: jmp PopAllAXEOI SendCode: mov AL,CS:[DI] test bKbBeepFlag,1 jz @@b push BX mov BX,801h call Beep pop BX @@b: cbw PutScanCode: and AL,7Fh or AL,AH out 60h,AL int 9 ret tCG1 LABEL byte INCLUDE cg8x8_1.asm Reboot: sti clr DS_AX test BY wEquipment,1 jz @@b cwd int 13h jc @@b mov AH,2 les BX,CS:@@a mov CX,1 mov AL,CL int 13h jc @@b db 0EAh @@a dd 7C00h @@b: iret twDivisor dw 1049,768,384,192,96,48,24,12 SerialPortSR: call PushAllSti pop AX mov SI,DX mov DI,DX shl SI,1 mov DX,twCOMPort[SI] jDXz @@i jAHz @@b dec AH jz @@d dec AH jz @@g dec AH jnz @@b jmp @@j @@d: push AX add DX,4 mov AL,3 out DX,AL inc DX inc DX mov BH,30h call WaitReady jz @@e @@f: pop CX mov AL,CL @@h: or AH,80h jmp @@i @@e: dec DX mov BH,20h call WaitReady jnz @@f sub DX,5 pop CX mov AL,CL out DX,AL jmp @@i @@g: add DX,4 mov AL,1 out DX,AL inc DX inc DX mov BH,20h call WaitReady jnz @@h dec DX mov BH,1 call WaitReady jnz @@h and AL,1Eh mov DX,twCOMPort[SI] in AL,DX jmp @@i @@b: mov AH,AL add DX,3 mov AL,80h out DX,AL mov DI,AX mov CL,12 shr DI,CL and DI,0Eh push DX AX sub DX,3 mov AX,CS:twDivisor[DI] out DX,AX pop AX DX and AH,1Fh mov AL,AH out DX,AL dec DX dec DX clr AL out DX,AL mov DX,twCOMPort[SI] @@j: add DX,5 in AX,DX xchg AL,AH @@i: jmp PopAll WaitReady: mov BL,tbTimeOutCOM[DI] clr CX @@a: in AL,DX mov AH,AL and AL,BH cmp AL,BH je @@b loop @@a loopBL @@a tst BH @@b: ret CheckSum: clr AL @@a: add AL,[BX] inc BX loop @@a tst AL ret KeyboardSR: sti push DS BX mov BX,40h mov DS,BX mov BX,pKbBufHead-B_D jAHz @@a dec AH jz @@c dec AH mov AL,bKbFlag0-B_D jmp @@d @@a: mov AH,1 int 16h jz @@a inc BX inc BX cmp BX,3Eh jne @@b sub BX,20h @@b: mov pKbBufHead-B_D,BX jmp @@d @@c: cmp BX,pKbBufTail-B_D mov AX,[BX] @@d: pop BX DS retf 2 tbScanCode db 27,76,0 ,84,53,28,72,80,10,24,11,85 db 12,75,82,65,13,14,71,79,8 ,9 ,25,26 db 33,73,81,49,32,31,44,0 ,50,37,48,34 db 61,0 ,0 ,64,60,59,40,1 ,6 ,7 ,63,62 db 18,0 ,29,35,17,16,30,58,36,23,20,19 db 54,55,56,46,45,88,87,42,0 ,0 ,47,57 db 0 ,69,83,0 ,39,68,78,77,38,66,0 ,67 db 3 ,74,15,21,2 ,70,41,43,0 ,22,5 ,4 tKeypadKey db 71,83,0 tExKey db 1,1,14,15,28,28,39,39,43,43,53,53,0 tExAscii db 1Bh,8,9,13,';\/' tShExAscii db 1Bh,8,9,0Dh,':|?' tShiftKey db 54 ;Right Shift db 42 ;Left Shift db 29 ;CTRL db 56 ;ALT db 70 ;Scroll Lock db 69 ;Num Lock db 58 ;Caps Lock db 82 ;Insert db 88 ;SH2 db 87 ;Rus Lock ;ORG 0E987h KeyboardISR: call PushAll mov ES,CS in AL,60h call ParseKey mov wKbFlag,DX mov bPrevKey,AH PopAllAXEOI: EOI PopAllAX: pop AX PopAll: pop DI SI BX CX DS ES BP DX iret ParseKey: mov AH,AL and AL,7Fh lea SI,bAltInput mov DX,wKbFlag lea DI,tShiftKey mov CX,10 repne scasb jne @@g mov BX,200h shr BX,CL cmp AL,AH jne @@d cmp BX,10h jb @@a cmp BH,1 jne @@b @@a: or DX,BX ret @@b: test DL,0Ch jnz @@g cmp AL,82 jne @@c call TestNumLock jnz @@g call @@c jmp InsertKey1 @@c: test BL,DH jnz @@ret or DH,BL xor DX,BX ret @@d: cmp BX,10h jb @@e cmp BH,1 jne @@f @@e: not BX and DX,BX cmp AH,0B8h ;ALT off jne @@ret mov AL,[SI] clr AH mov [SI],AH jALz @@ret jmp InsertKey @@f: not BL and DH,BL ret @@g: cmp AL,AH jne @@ret cmp AL,59 jb @@i cmp AL,68 ja @@i test DL,0Fh jz @@h add AL,19h test DL,0Ch jz @@h add AL,10 test DL,8 jz @@h add AL,10 @@h: jmp InsertExKey @@i: test DH,8 ;Pause jz @@j cmp AL,69 ;NUM je @@ret and DH,NOT 8 ret @@j: cmp AL,57 jne @@j1 mov AL,' ' jmp InsertKey @@j1: test DL,0Ch ;ALT or CTRL jnz @@y @@k: jmp @@m cmp AL,47h jae @@m test DL,3 jnz @@k ; lea BX,tAscii0 call CheckAsciiKey clr CL jmp @@y @@l: cmp AL,55 ;SHIFT-PrtScr jne @@m EOI int 5 ret @@m: call CheckKeyType dw tAsciiLetter jne @@s @@n: @@o: mov CL,DH and CL,3 jnp @@p lea BX,tLatAscii xlat CS:[BX] jALz @@ret mov CL,DL and CL,43h jz @@ik cmp CL,41h jae @@ik sub AL,20h jmp @@ik @@p: lea BX,tRusAscii xlat CS:[BX] mov CL,DL and CL,43h jz @@q cmp CL,41h jb @@ik @@q: cmp AL,'๐' jne @@r inc AL jmp @@ik @@r: add AL,20h cmp AL,0B0h jb @@ik add AL,30h jmp @@ik @@s: call CheckKeyType dw tUpKey jne @@u lea BX,tUpAscii test DX,103h jz @@t lea BX,tShiftUpAscii test DL,3 jnz @@t lea BX,tSh2UpAscii @@t: jmp @@x @@u: call TestNumLock lea BX,tKeypadNums jnz @@v lea BX,tKeypadArrows @@v: call CheckAsciiKey @@w: call CheckKeyType dw tExKey jne @@ret lea BX,tExAscii test DL,3 jz @@x lea BX,tShExAscii @@x: xlat CS:[BX] @@ik: jmp InsertKey @@ret: ret @@y: test DL,8 jz Ctrl @@z: test DL,4 jz Alt cmp AL,83 jne @@ret mov wResetFlag,1234h jmp Reset Alt: call CheckKeyType dw tAltKey jne @@a Mov BY [SI],0 lea BX,tAltAscii xlat CS:[BX] jmp InsertExKey @@a: cmp AL,71 jb @@b cmp AL,82 ja @@b lea BX,tKeypadAlt-71 xlat CS:[BX] tst AL js @@b xchg AL,[SI] mov AH,10 mul AH add [SI],AL @@b: ret Ctrl: test DL,3 jz @@a call CheckKeyType dw tGraphKey jne @@z lea BX,tGraphAscii xlat CS:[BX] jmp InsertKey @@a: cmp AL,70 ;Break jne @@b mov AX,pKbBufHead mov pKbBufTail,AX mov bBreakFlag,80h int 1Bh clr AX jmp InsertKey @@b: cmp AL,69 ;Pause jne @@d or bKbFlag1,8 EOI @@c: test bKbFlag1,8 ; jnz @@s ret @@d: cmp AL,55 ;CTRL-PrtScr jne @@e mov AH,72h jmp InsertKey1 @@e: cmp AL,3 ;CTRL-2 (NUL) jne @@e2 clr AL jmp InsertKey @@e2: cmp AL,7 ;CTRL-6 (RS) jne @@f mov AL,1Eh jmp InsertKey @@f: call CheckKeyType dw tAsciiLetter jne @@g lea BX,tLatAscii xlat CS:[BX] jALz @@z sub AL,60h jmp InsertKey @@g: lea BX,tKeypadCtrl call CheckAsciiKey @@z: ret InsertExKey: mov AH,AL InsertKey1: clr AL InsertKey: mov DI,pKbBufTail mov SI,DI scasw cmp DI,3Eh jne @@a mov DI,1Eh @@a: cmp DI,pKbBufHead mov BX,504h je Beep mov B_D[SI],AX mov pKbBufTail,DI ret TestNumLock: mov BL,DL and BL,23 jz @@a cmp BL,21h jb @@a cmp AL,AL @@a: ret CheckKeyType: pop DI mov BX,CS:[DI] scasw push DI DX clr DL @@a: mov CX,CS:[BX] cmp AL,CL jb @@c cmp AL,CH jbe @@b sub CH,CL add DL,CH inc DX inc BX inc BX cmp CL,1 jae @@a pop DX ret @@b: sub AL,CL add AL,DL cmp AL,AL @@c: pop DX CheckAsciiRet: ret CheckAsciiKey: mov CX,CS:[BX] cmp AL,CL jb CheckAsciiRet cmp AL,CH ja CheckAsciiRet sub AL,CL add AL,2 xlat CS:[BX] pop CX jALz CheckAsciiRet test AL,80h jz InsertKey cmp AL,0FEh jne @@a mov AH,132 jmp InsertKey1 @@a: and AL,7Fh jmp InsertExKey tGraphKey db 2,13,16,27,30,41,43,43,53,53,84,85 tGraphAscii db 'หปีัธึาทฺยฟฤ',0 db 'ฬฮนฦุตวืถรลด',0,0 db 'ศสผิฯพำะฝู' tAsciiLetter db 16,27,30,38,44,52,84,86,0 tKeypadNums db 71,83 db '789-456+1230.' tKeypadArrows db 71,83 db 0C7h,0C8h,0C9h,'-',0CBh,0,0CDh,'+',0CFh,0D0h,0D1h db 0D2h,0D3h tKeypadCtrl db 71,83 db 0F7h,0,0FEh,0,0F3h,0,0F4h,0,0F5h,0,0F6h,0,0 tKeypadAlt db 7,8,9,-1,,4,5,6,-1,1,2,3,0 tUpKey db 2,13,40,41,0 tUpAscii db ')-/":,._?%!;*(' tSh2UpAscii db '&@^{}\<>|[]`~',39 tAltKey db 2,12,16,25,30,38,44,50,88,88 tAltAscii db 78h,79h,7Ah,7Bh,7Ch,7Dh,7Eh,7Fh,80h,81h,83h db 16,17,18,19,20,21,22,23,24,25,30,31,32,33,34,35,36,37 db 38,44,45,46,47,48,49,50 DiskSR: call PushAllSti pop AX push AX CX Mov AL,BY wEquipment test AL,1 jz @@a mov CL,6 shr AL,CL pop CX cmp AL,DL jb @@c pop AX jmp @@b @@a: mov AH,12 pop CX jmp @@c @@b: push CX mov CH,1 mov CL,DL rol CH,CL mov bMotorStat,CH pop CX call @@e mov AH,bDisketteStat cmp AH,1 cmc jmp @@d @@c: pop AX stc @@d: pop DI SI BX CX DS ES BP DX retf 2 @@e: jAHz Recalibrate cmp AH,6 jge @@l cmp AH,1 je GetStatus mov bDisketteStat,0 cmp DL,2 jae @@g cmp AH,5 je Format cmp AH,3 jb @@g je @@f lea BP,VerifySector jmp @@h @@f: lea BP,WriteSector jmp @@h @@g: lea BP,ReadSector @@h: call SelectDrive call Seek jc @@l clr DL @@i: push AX mov AL,CL out 0C2h,AL cli call BP pop AX jc @@l cmp CX,1 jne @@k jDHnz @@k cmp BY ES:[BX-512+15h],0FDh je @@j mov tbFddStat[SI],43h jmp @@k @@j: cmp tbFddTracks[SI],50 jb @@m mov tbFddStat[SI],63h jmp @@k @@m: mov tbFddStat[SI],43h @@k: inc DL inc CL cmp AL,DL jne @@i ret @@l: xchg AX,DX ret Put MACRO b in AL,0C4h mov AL,b out DX,AL ENDM PutL MACRO b,c LOCAL lab mov CL,c lab: Put b loopCL lab ENDM Format1: mov AL,10h ret Format: call SelectDrive call Seek jc Format1 cbw push AX lds DI,DS:[1Eh*4] mov SI,BX mov DX,0C3h mov AL,0F0h cli out 0C0h,AL PutL 4Eh,60 ;[DI+7] mov CX,12 call PutLong mov CX,0F603h call PutLong Put 0FCh PutL 4Eh,50 pop CX mov CX,9 FormB: push CX PutL 0,12 mov CX,0F503h call PutLong Put 0FEh mov CX,4 @@c: in AL,0C4h lods BY ES:[SI] out DX,AL loop @@c Put 0F7h PutL 4Eh,22 mov CX,12 call PutLong mov CX,0F503h call PutLong Put 0FBh mov AX,80h mov CL,[DI+3] shl AX,CL xchg AX,CX @@j: in AL,0C4h mov AL,0D5h out DX,AL loop @@j Put 0F7h PutL 4Eh,45 pop CX loop FormB mov CX,7000 @@p: in AL,0C4h mov AL,4Eh out DX,AL loop @@p sti clr DS_AX in AL,0C0h and AL,47h jz @@f test AL,40h mov AL,3 jnz @@e mov AL,20h @@e: or bDisketteStat,AL stc @@f: ret PutLong: in AL,0C4h mov AL,CH out DX,AL loopCL PutLong ret ReadSector: push CX mov CX,wSectorSize inc CX mov DI,BX ;This Routine must be changed mov AL,80h ;Error:if sector>assumed it read full out 0C0h,AL jmp @@b @@a: stosb @@b: in AL,0C4h shr AL,1 in AL,0C3h jnc @@c loop @@a @@c: mov BX,DI pop CX jmp TestError WriteSector: push CX mov CX,wSectorSize mov SI,BX mov AL,0A0h out 0C0h,AL @@a: in AL,0C4h shr AL,1 lods BY ES:[SI] out 0C3h,AL jnc @@b loop @@a @@b: dec SI mov BX,SI pop CX jmp TestError VerifySector: push CX mov CX,wSectorSize inc CX mov AL,80h out 0C0h,AL @@a: in AL,0C4h shr AL,1 in AL,0C3h jnc @@b loop @@a @@b: pop CX TestError: sti in AL,0C0h and AL,0DFh jALz @@c in AL,0C0h test AL,10h mov AH,4 jnz @@b test AL,8 mov AH,10h jnz @@b mov AH,20h @@b: or bDisketteStat,AH stc @@c: ret GetStatus: mov AL,bDisketteStat ret SelectDrive: push AX BX CX mov AL,DL mov CL,DL inc AX and bMotorStat,0F0h or bMotorStat,AL mov AL,5 shl AL,CL mov AH,DH and AH,1 mov CL,4 rol AH,CL or AL,AH or AL,40h out 0C4h,AL in AL,0C6h test AL,1 out 0C6h,AL jnz @@a mov CL,DL mov BL,1 shl BL,CL clr CX test BL,bNec+3 jnz @@b @@a: loop @@a mov bNec+3,BL out 0C6h,AL @@b: in AL,0C0h and AL,80h loopnz @@b pop CX BX AX ret Seek: push AX DX clr AH mov AL,bMotorStat dec AX xchg AX,SI cmp tbFddCurTrack[SI],-1 jne @@a call SelectDrive mov DX,SI call Recalibrate cmp bDisketteStat,0 jne @@e @@a: mov AL,tbFddCurTrack[SI] mov DL,CH test tbFddStat[SI],20h jz @@c shl DL,1 @@c: mov tbFddCurTrack[SI],DL out 0C1h,AL xchg AX,DX out 0C3h,AL mov AL,18h out 0C0h,AL in AL,0C4h @@d: in AL,0C0h test AL,1 jnz @@d and AL,19h jALz @@f @@e: or bDisketteStat,40h mov bNec[SI],-1 stc @@f: mov AL,CH out 0C1h,AL pop DX AX ret Recalibrate: push AX SI CX DX cli out 0C6h,AL mov SI,DX mov tbFddCurTrack[SI],0 mov CL,DL mov AL,5 shl AL,CL mov AH,DH and AH,1 mov CL,4 rol AH,CL or AL,AH out 0C4h,AL or AL,40h mov bSeekStat,0 mov bDisketteStat,0 out 0C4h,AL sti mov AH,2 @@a: clr CX @@b: push AX in AL,0C0h and AL,5 cmp AL,4 pop AX jz @@c loop @@b dec AH jnz @@a or bDisketteStat,20h mov tbFddCurTrack[SI],-1 @@c: les DI,DS:[1Eh*4] mov AX,128 mov CL,ES:[DI+3] shl AX,CL mov wSectorSize,AX pop DX CX SI AX ret sMemorySize db ' KB of Conventional Memory' Beep: push AX CX mov AL,0B6h out 43h,AL clr AL out 42h,AL mov AL,BH out 42h,AL in AL,61h push AX or AL,3 out 61h,AL mov CX,256 @@a: loop @@a loopBL @@a pop AX out 61h,AL mov AL,0B0h out 43h,AL out 42h,AL out 42h,AL pop CX AX ret WordToPort42: out 42h,AL mov AL,AH out 42h,AL ret tDisketteParam db 0Fh,0,0,2,10,20,0FFh,40,0DDh,0,0 ParallelPortSR: call PushAll pop AX mov SI,DX shl SI,1 mov DX,twLPTPort[SI] jDXz @@j jAHnz @@d @@a: clr CX out DX,AL inc DX @@b: in AL,DX and AL,0F0h test AL,20h jz @@c loop @@b or AL,1 jmp @@f @@c: mov AL,1 out DX,AL clr AL out DX,AL jmp @@e1 @@d: dec AH jnz @@e inc DX inc DX mov AL,88h out DX,AL mov CX,1000 loop $ dec DX jmp @@e1 @@e: dec AH jnz @@l inc DX @@e1: in AL,DX @@f: mov AH,AL cmp AH,0F0h jne @@g clr AH jmp @@k @@g: and AH,1 shl AL,1 jnc @@h ;Test ERROR or AH,8 @@h: shl AL,1 jnc @@i ;Test PAPER END or AH,20h @@i: shl AL,1 jnc @@j ;Test BUSY or AH,80h @@j: shl AL,1 jnc @@k ;Test ACK or AH,40h @@k: xor AH,48h @@l: jmp PopAll tVideoFunctions dw SetVideoMode,SetCursorSize,SetCursorPos,GetCursorPos dw GetPenPos,SelectActivePage,ScrollUp,ScrollDown,ReadChar dw WriteCharAttr,WriteChar,SetPalette,WritePixel dw ReadPixel,Teletype,GetMode,EmptyRet,EmptyRet dw Alternative,WriteString VideoSR: call PushAll pop AX push AX @@a: mov AL,AH cbw mov SI,AX shl SI,1 cmp AX,40 ja PopAllAX mov AX,0B800h mov ES,AX pop AX mov AH,bCrtMode call CS:tVideoFunctions[SI] jmp PopAll SetVideoMode: cmp AL,7 jae @@g mov AH,AL in AL,28h mov AL,AH mov SI,AX mov bCrtMode,AL lea BX,tPort68Value xlat CS:[BX] out 68h,AL mov wPort6845,3D4h ; cmp AH,3 ; jne @@a ; mov AL,0C0h ; jmp @@c ; @@a: cmp AH,2 ; jne @@b ; mov AL,0C0h ; jmp @@c @@b: mov AL,80h @@c: out 6Ah,AL clr DI mov pCrtStart,DI mov CX,2000h call TestGraphMode jnz @@d mov AX,720h push CX rep stosw pop CX @@d: clr AX rep stosw mov bActivePage,AL mov wCursorMode,607h mov bCrtModeSet,29h mov AL,80 mov BX,SI test BL,2 jnz @@e sar AX,1 @@e: mov wCrtColumns,AX and SI,6 mov CX,CS:tCrtMode[SI] mov wCrtLength,CX mov CX,8 lea DI,twCursorPos mov ES,DS clr AX rep stosw mov AL,3Dh cmp BL,6 jne @@f mov AL,3Fh @@f: mov bCrtPalette,AL @@g: ret SetCursorSize: mov wCursorMode,CX ret SetCursorPos: mov AL,BH cbw shl AX,1 xchg AX,SI mov twCursorPos[SI],DX cmp bActivePage,BH jne @@b call RemoveCursor call GetGraphCurPos call TestGraphMode jnz @@a add DI,04000h @@a: mov pCursor,DI @@b: ret GetCursorPos: mov BL,BH clr BH shl BX,1 mov DX,twCursorPos[BX] mov [BP+16],DX mov CX,wCursorMode mov [BP+8],CX ret GetPenPos: clr AH ret SelectActivePage:call RemoveCursor mov bActivePage,AL cbw mul wCrtLength mov pCrtStart,AX call TestGraphMode jnz @@b xchg AX,SI mov CX,2048 @@a: or WO ES:[SI],0 inc SI inc SI loop @@a ret @@b: mov CH,bActivePage ror CH,2 ; in AL,68h and AL,NOT 40h or AL,CH ; out 68h,AL ret ReadChar: cmp AH,4 jae GraphicsRead call GetTextCurPos mov AX,ES:[DI] ret GraphicsRead: call GetGraphCurPos mov SI,AX sub SP,8 mov BP,SP mov CX,4 call Test80Mode mov DS,ES jz @@b @@a: lodsb mov [BP],AL inc BP mov AL,[SI+1FFFh] mov [BP],AL inc BP add SI,79 loop @@a jmp @@d @@b: shl SI,1 @@c: call ConvToOne add SI,1FFEh call ConvToOne sub SI,1FB2h loop @@c @@d: xchg AX,CX mov DS,AX les DI,DS:[43h*4] mov BP,SP mov SI,SP @@e: mov DS,SS mov DX,256 @@f: push SI DI mov CX,8 repe cmpsb pop DI SI jz @@g inc AL add DI,8 loopDX @@f @@g: add SP,8 ret ConvToOne: lodsw xchg AL,AH mov DX,0C000h @@a: test AX,DX jz @@b stc @@b: rcl CH,1 shr DX,1 shr DX,1 jnc @@a mov [BP],CH inc BP clr CH ret WriteCharAttr: call TestGraphMode jnz GrWriteChar mov AH,BL push AX CX call GetTextCurPos pop CX AX rep stosw ret WriteChar: call TestGraphMode jnz GrWriteChar push AX CX call GetTextCurPos pop CX AX @@a: stosb inc DI loop @@a ret ReadPixel: call GetPointAddr lods BY ES:[SI] and AL,AH shl AL,CL mov CL,DH rol AL,CL ret WritePixel: push AX AX call GetPointAddr shr AL,CL and AL,AH mov CL,ES:[SI] pop BX test BL,80h jnz @@b not AH and CL,AH or AL,CL @@a: mov ES:[SI],AL ret @@b: xor AL,CL jmp @@a SetPalette: mov DX,wPort6845 add DX,5 mov AL,bCrtPalette jBHnz @@a and AL,0E0h and BL,1Fh or AL,BL jmp @@b @@a: and AL,0DFh shr BL,1 jnc @@b or AL,20h @@b: mov bCrtPalette,AL out DX,AL ret GetPointAddr: push BX AX DX mov AL,40 and DL,0FEh mul DL pop DX test DL,1 jz @@a add AX,2000h @@a: xchg AX,SI pop AX mov DX,CX mov BX,2C0h mov CX,302h cmp bCrtMode,6 jb @@b mov BX,180h mov CX,703h @@b: and CH,DL shr DX,CL add SI,DX mov DH,BH clr CL @@c: ror AL,1 add CL,CH dec BH jnz @@c mov AH,BL shr AH,CL pop BX ret Teletype: sub BP,30 mov BH,bActivePage push BX call GetCursorPos pop BX cmp AL,8 jne @@a jDLz @@i dec DX jmp @@i @@a: cmp AL,13 jne @@b clr DL jmp @@i @@b: cmp AL,10 jne @@c clr DL cmp DH,24 jne @@h jmp @@e @@c: cmp AL,7 jne @@d call Beep jmp @@k @@d: mov CX,1 call WriteChar inc DL cmp DL,bCrtColumns jne @@i clr DL cmp DH,24 jne @@h @@e: mov AH,2 mov BH,bActivePage int 10h call TestGraphMode jz @@f clr BH jmp @@g @@f: mov BH,bActivePage mov AH,bCrtMode call ReadChar mov BH,AH @@g: mov AX,601h clr CX mov DH,24 mov DL,bCrtColumns dec DX int 10h clr DL dec DH @@h: inc DH @@i: mov BH,bActivePage call SetCursorPos @@k: ret GetMode: mov AL,bActivePage mov [BP+7],AL Mov AX,WO bCrtMode ret Alternative: cmp BL,34h jne @@c jALz @@a mov bCursorOn,0 jmp @@b @@a: mov bCursorOn,0Fh @@b: mov AL,12h @@c: ret WriteString: cmp AL,4 jae @@k jCXz @@k push BX mov BL,BH clr BH shl BX,1 mov SI,twCursorPos[BX] pop BX push SI AX mov AX,200h int 10h pop AX mov ES,[BP+12] mov BP,[BP+14] @@a: push CX BX AX xchg AL,AH mov AL,ES:[BP] inc BP cmp AL,13 je @@d cmp AL,10 je @@d cmp AL,8 je @@d cmp AL,7 je @@d mov CX,1 cmp AH,2 jae @@c @@b: mov AH,9 int 10h inc DL cmp DL,bCrtColumns jae @@e jmp @@g @@c: mov BL,ES:[BP] inc BP jmp @@b @@d: mov AH,0Eh int 10h mov BL,BH clr BH shl BX,1 mov DX,twCursorPos[BX] jmp @@h @@e: cmp DH,24h jne @@f mov AX,0E0Ah int 10h dec DH @@f: inc DH clr DL @@g: mov AX,200h int 10h @@h: pop AX BX CX loop @@a pop DX cmp AL,1 jz @@k cmp AL,3 je @@k mov AX,200h int 10h @@k: ret ScrollUp: mov BL,AL clr SI cmp AH,4 jae UpGraphics jmp Scroll ScrollDown: mov BL,AL mov SI,240 cmp AH,4 jae DownGraphics Scroll: push AX in AL,68h or AL,8 out 68h,AL pop AX push BX SI AX CX DX DS BX mov BH,bActivePage tst SI jz @@a mov AL,CL mov AH,DH jmp @@b @@a: mov AX,CX @@b: call GetTextPos pop BX sub DX,CX add DX,101h clr CH mov BP,wCrtColumns shl BP,1 mov AL,BL mul bCrtColumns shl AX,1 jSIz @@c neg AX neg BP @@c: mov DS,ES tst BL jz @@e mov SI,DI add SI,AX sub DH,BL @@d: mov CL,DL push SI DI rep movsw pop DI SI add SI,BP add DI,BP loopDH @@d mov AH,BH mov AL,' ' mov DH,BL @@e: mov BL,DH @@f: mov CL,DL push DI rep stosw pop DI add DI,BP loopBL @@f in AL,68h and AL,NOT 8 out 68h,AL pop DS DX CX AX SI mov AX,0BC00h mov ES,AX pop BX clr AL test BH,0F0h jz @@g dec AX @@g: mov BH,AL push BX clr BH tst BP js DownFromText jmp UpFromText UpGraphics: push BX mov BH,bActivePage UpFromText: mov BP,1FAFh mov AX,CX jmp DoScroll DownGraphics: push BX mov BH,bActivePage DownFromText: mov BP,204Fh mov AH,DH mov AL,CL DoScroll: call RemoveCursor call GetGraphPos pop BX add DI,SI sub DX,CX add DX,101h shl DH,2 call Test80Mode jnz @@g shl DL,1 @@g: mov DS,ES clr CH shl BL,2 jz @@c mov AL,BL tst BP jp @@a neg AL @@a: mov AH,80 imul AH mov SI,DI add SI,AX sub DH,BL @@b: mov CL,DL rep movsb add SI,1FFFh add DI,1FFFh std mov CL,DL rep movsb cld sub SI,BP sub DI,BP loopDH @@b mov DH,BL @@c: mov BL,DH mov AL,BH @@d: mov CL,DL rep stosb add DI,1FFFh std mov CL,DL rep stosb cld sub DI,BP loopBL @@d ret GrWriteChar: clr AH call GetGraphCurPos PutChar: push ES les SI,DS:[43h*4] cmp AL,80h jb @@a les SI,DS:[1Fh*4] sub AL,80h @@a: cbw shl AX,3 add SI,AX mov AL,bCrtMode mov DS,ES pop ES test AL,4 jnz @@j test AL,2 jz @@f clr DL test BL,0F0h jz @@b dec DX @@b: push SI DI CX mov CX,4 @@c: lodsb xor AL,DL stosb lodsb xor AL,DL add DI,1FFFh stosb sub DI,1FB1h loop @@c pop CX DI SI inc DI loop @@b ret @@f: jmp @@o @@j: test AL,2 jz @@o @@k: push SI DI mov DH,4 @@l: lodsb tst BL js @@n stosb lodsb @@m: mov ES:[DI+1FFFh],AL add DI,79 loopDH @@l pop DI SI inc DI loop @@k ret @@n: xor AL,ES:[DI] stosb lodsb xor AL,ES:[DI+1FFFh] jmp @@m @@o: push BX mov DL,3 and BL,DL mov DH,BL @@p: shl DH,2 or BL,DH loopDL @@p mov BH,BL pop DX mov DH,4 @@q: push SI DI @@r: call PutLine add DI,1FFFh call PutLine sub DI,2000h-80 loopDH @@r pop DI SI scasw loop @@q ret PutLine: lodsb call Double and AX,BX xchg AL,AH tst DL jns @@a xor AX,ES:[DI] @@a: stosw ret Double: push BX CX DX clr DX mov CX,1 @@a: mov BX,AX and BX,CX or DX,BX shl AX,1 shl CX,1 mov BX,AX and BX,CX or DX,BX shl CX,1 jnc @@a xchg AX,DX pop DX CX DX ret RemoveCursor: mov bCursorCount,4 cmp bCursorOn,0F0h jne RetRemove InvertCursor: push SI ES mov SI,0B800h mov ES,SI mov SI,pCursor not bCursorOn call Test80Mode jnz @@a add SI,240 not WO ES:[SI] add SI,2000h not WO ES:[SI] jmp @@b @@a: add SI,240 not BY ES:[SI] add SI,2000h not BY ES:[SI] @@b: pop ES SI RetRemove: ret GetTextCurPos: mov CL,BH clr CH mov SI,CX shl SI,1 mov AX,twCursorPos[SI] GetTextPos: push AX BX DX AX mov AL,BH cbw mul wCrtLength xchg AX,DI pop BX mov AL,BH mul bCrtColumns clr BH add AX,BX shl AX,1 add DI,AX pop DX BX AX ret GraphCurPos: push SI mov AL,bActivePage cbw shl AX,1 mov SI,AX mov AX,twCursorPos[SI] GraphPos: push BX mov BX,AX mov AL,AH mul bCrtColumns shl AX,2 clr BH add AX,BX pop BX ret GetGraphDefPos: mov BH,bActivePage GetGraphCurPos: mov CL,BH clr CH shl CX,1 mov SI,CX mov AX,twCursorPos[SI] clr BH GetGraphPos: push AX BX DX AX mov AL,BH cbw mul wCrtLength xchg AX,DI pop BX push DI mov AL,BH mov AL,40 mul BH shl AX,3 clr BH call Test80Mode jnz @@b shl BL,1 @@b: add AX,BX pop DI add DI,AX pop DX BX AX ret TestGraphMode: test bCrtMode,4 ret Test80Mode: test bCrtMode,2 EmptyRet: ret NmiISR: call PushAll mov CX,0B800h mov ES,CX in AX,28h mov BX,AX test AH,40h jnz @@g and BX,3FFEh mov DX,ES:[BX] mov CH,0BCh mov ES,CX mov CL,BH mov AL,160 and BH,0Fh call Test80Mode jnz @@a shl CL,1 mov AL,80 and BH,7 @@a: shr CL,4 clr AH cmp CL,bActivePage jne PopAllAX mov BP,-320 mov DI,BP @@c: sub DI,BP sub BX,AX jae @@c add BX,AX call Test80Mode jz @@e shr BX,1 @@e: add DI,BX call RemoveCursor xchg AX,DX mov BL,AH mov CX,1 call PutChar @@f: jmp PopAllAX @@g: test AH,80h jnz @@i @@h: pop AX mov AL,-1 jmp PopAll @@i: clr BH in AL,2Ah mov SI,AX sub BL,0D4h jz @@k dec BX jz @@l sub BL,3 jz @@p dec BX jne PopAllAX xchg AL,AH in AL,68h mov BL,AH and BL,10h shl BL,1 and AX,7C8h or AH,BL or AL,AH out 68h,AL jmp PopAllAX @@k: mov bReg6845,AL jmp PopAllAX @@l: mov CL,bReg6845 cmp CL,11 jne @@m Mov BY wCursorMode,AL @@m: cmp CL,10 jne @@n Mov BY wCursorMode,AL @@n: cmp CL,15 je @@o cmp CL,14 jne PopAllAX mov bCursorPosH,AL jmp PopAllAX @@o: mov bCursorPosL,AL mov AH,bCursorPosH sar AX,1 mov BH,AH call Test80Mode jz @@x mov CL,80 and AH,7 jmp @@y @@x: mov CL,40 @@y: div CL xchg AL,AH xchg AX,DX mov AX,SI mov BH,bActivePage call SetCursorPos jmp PopAllAX @@p: and AL,1Fh ; Port 3D8 jz PopAllAX ; Mode Select Register test AL,8 jnz PopAllAX test AL,12h jnz @@s cbw test AL,1 jz @@q mov AH,2 @@q: test AL,4 jnz @@t clr AH test AL,1 jz @@r mov AH,2 @@r: test AL,4 jnz @@t inc AH jmp @@t @@s: mov AH,6 test AL,10h jnz @@t dec AH test AH,4 jnz @@t dec AH @@t: xchg AL,AH cbw int 10h jmp PopAllAX GetMemSizeSR: push DS clr DS_AX mov AX,wMemorySize pop DS iret GetEquipmentSR: push DS clr DS_AX mov AX,wEquipment pop ds iret CassetteSR: push DS AX clr DS_AX pop AX call @@a pop DS retf 2 @@a: jAHz @@c dec AH jz @@c dec AH jz ReadBlock dec AH jz WriteBlock @@b: mov AH,80h stc @@c: ret ReadBlock: push BX CX SI mov SI,7 @@a: in AL,62h and AL,10h mov bLastVal,AL mov DX,16250 @@b: dec DX jz @@n call ReadHalfBit jCXz @@b call ReadHalfBit jCXz @@a mov DX,BX call ReadHalfBit jCXz @@a add BX,DX mov CX,256 @@c: xchg BX,DX push CX call ReadHalfBit or CX,CX pop CX jz @@a push CX BX call ReadHalfBit or CX,CX pop AX CX jz @@a add BX,AX sub DX,BX jnc @@d neg DX @@d: cmp DX,0C0h jnc @@a loop @@c xchg BX,DX mov CX,0FFh clr AX @@e: push CX AX call ReadHalfBit push BX call ReadHalfBit pop AX add BX,AX pop AX CX sub BX,DX add AX,BX loop @@e mov CL,8 sar AX,CL add DX,AX mov BX,DX sar BX,1 mov DX,BX sar BX,1 add DX,BX mov wLowLim,DX mov DX,BX sar BX,1 add DX,BX @@f: call ReadHalfBit cmp DX,BX jc @@f call ReadHalfBit call ReadByte cmp AL,16h jne @@m pop SI CX BX push CX @@g: mov wCRC,-1 mov DX,256 @@h: call ReadByte jc @@j jCXz @@i mov ES:[BX],AL inc BX dec CX @@i: loopDX @@h call ReadByte call ReadByte clr AH cmp wCRC,1D0Fh jne @@k jCXz @@l jmp @@g @@j: mov AH,1 @@k: inc AH @@l: pop DX sub DX,CX push AX test AH,3 jnz @@o call ReadByte jmp @@o @@m: dec SI jnz @@a @@n: pop SI CX BX mov AH,4 cwd push AX @@o: pop AX cmp AH,1 cmc ret ReadByte: push BX CX mov CL,8 @@a: push CX call ReadHalfBit jCXz @@c push BX call ReadHalfBit pop AX jCXz @@c add BX,AX cmp BX,wLowLim cmc lahf pop CX rcl CH,1 sahf call CrcGen loopCL @@a mov AL,CH clc @@b: pop CX BX ret @@c: pop CX stc jmp @@b WriteBlock: push BX CX in AL,61h and AL,0FDh or AL,1 out 61h,AL mov AL,0B6h out 43h,AL mov AX,1184 call WordToPort42 mov CX,2048 @@a: stc call WriteBit loop @@a clc call WriteBit pop CX BX mov AL,16h call WriteByte @@b: mov wCRC,-1 mov DX,256 @@c: mov AL,ES:[BX] call WriteByte jCXz @@d inc BX dec CX @@d: loopDX @@c mov AX,wCRC not AX push AX xchg AL,AH call WriteByte pop AX call WriteByte jCXnz @@b push CX mov CX,32 @@e: stc call WriteBit loop @@e pop CX in AL,61h and AL,0FEh out 61h,AL clr AX ret WriteByte: push AX CX mov CH,AL mov CL,8 @@a: rcl CH,1 pushf call WriteBit popf call CrcGen loopCL @@a pop CX AX ret WriteBit: mov BP,1184 jc @@a shr BP,1 @@a: in AL,62h and AL,20h jz @@a @@c: in AL,62h and AL,20h jnz @@c xchg AX,BP jmp WordToPort42 CrcGen: mov AX,wCRC rcr AX,1 rcl AX,1 clc jno @@a xor AX,810h stc @@a: rcl AX,1 mov wCRC,AX ret ReadHalfBit: mov CX,100 mov AH,bLastVal @@a: in AL,62h and AL,10h cmp AL,AH loope @@a mov bLastVal,AL clr AL out 43h,AL in AL,40h mov AH,AL in AL,40h xchg AL,AH mov BX,wEdgeCount sub BX,AX mov wEdgeCount,AX ret ORG 0FA6Eh tCharGenerator LABEL byte INCLUDE cg8x8_0.asm TimeSR: push DS AX clr DS_AX pop AX jAHz @@a dec AH jnz @@b Mov WO dTimerCount,DX Mov WO dTimerCount+2,CX mov bTimerOverflow,0 jmp @@b @@a: mov AL,bTimerOverflow mov bTimerOverflow,0 Mov DX,WO dTimerCount Mov CX,WO dTimerCount+2 @@b: pop DS iret PushAllSti: sti PushAll: push BP ES DS CX BX SI DI AX mov BP,SP push [BP+16] mov [BP+16],DX clr DS_AX cld ret ORG 0FEC0h tISR dw EmptyIRET,EmptyIRET,NmiISR,EmptyIRET,EmptyIRET dw PrintScreenSR dw EmptyIRET,EmptyIRET dw TimerISR,KeyboardISR,EmptyISR dw EmptyISR,EmptyISR,EmptyISR,EmptyISR,EmptyISR dw VideoSR,GetEquipmentSR,GetMemSizeSR,DiskSR dw SerialPortSR,CassetteSR,KeyboardSR dw ParallelPortSR,EmptyIRET,Reboot dw TimeSR,EmptyIRET,EmptyIRET dw EmptyIRET,tDisketteParam,tCG1 tPort68Value db 40h,40h,0C0h,0C0h,28h,28h,88h,88h tCrtMode dw 800h,1000h,4000h,4000h tShiftUpAscii db '1234567890=$#+' EmptyISR: push AX mov AL,0Bh out 20h,AL in AL,20h mov AH,AL in AL,20h mov AH,AL or AL,AH jz @@a in AL,21h or AL,AH out 21h,AL EOI @@a: pop AX EmptyIRET: iret PrintScreenSR: sti call PushAll cmp bPrtScrStat,1 je @@h mov bPrtScrStat,1 mov AH,0Fh int 10h mov CL,AH call @@i push CX mov AH,3 int 10h pop CX push DX clr DX @@a: mov AH,2 int 10h mov AH,8 int 10h jALnz @@b mov AL,' ' @@b: clr AH call @@j test AH,25h jnz @@d inc DL cmp CL,DL jne @@a clr AH clr DL call @@i inc DH cmp DH,25 jne @@a @@c: pop DX mov AH,2 int 10h mov bPrtScrStat,0 jmp @@h @@d: pop DX mov AH,2 int 10h @@e: mov bPrtScrStat,-1 @@h: jmp PopAllAX @@i: mov AX,10 @@j: push DX cwd int 17h pop DX ret tRusAscii db '‰–“Š…ƒ˜™‡•š”›‚€Ž‹„Ÿ—‘Œˆ’œž†๐' tLatAscii db 'qwertyuiop',0,0,'asdfghjklzxcvbnm',0,0,0,0,0 ORG 0FFF0h db 0EAh dw Reset,0F000h db '06/30/94',0FFh,0FEh END