IMD 1.18: 15/07/2013 8:47:58 cpm86 program development aids  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@052984012304AMATCH #3977  USCBIOS LST USCBIOS LST USCBIOS LSTUSCBIOS LST !"#USCBIOS LST$%&'()*+USCBIOS LST,-./0123USCBIOS LST456789:;USCBIOS LST<=>?@ABCUSCBIOS LSTDEFGHIJKUSCBIOS LST LMNOPQRSUSCBIOS LST TUVWXYZ[USCBIOS LST \]^_`abcUSCBIOS LST defghijkUSCBIOS LST lmnopqrsUSCBIOS LSTtuvwxyz{USCBIOS LST|}~USCBIOS LSTUSCBIOS LSTUSCBIOS LSTUSCBIOS LSTUSCBIOS LSTUSCBIOS LSTUSCBIOS LSTUSCBIOS LSTUSCBIOS LSTUSCBIOS LSTUSCBIOS LSTUSCBIOS LSTUSCBIOS LSTUSCBIOS LSTUSCBIOS LSTUSCBIOS LSTUSCBIOS LST   USCBIOS LST  USCBIOS LSTUSCBIOS LST !"#USCBIOS LST$%&'()*+USCBIOS LST,DDNECAPCLST-./01234DDNECAPCLST56789:;<DDNECAPCLST=>?@ABCDDDNECAPCLSTEFGHIJKLDDNECAPCLSTMNOPQRSTDDNECAPCLSTUVWXYZ[\DDNECAPCLST]^_`abcdDDNECAPCLSTefghijklDDNECAPCLSTmnopqrstDDNECAPCLST >uvwxDDNECLIBLSTyz{|}~DDNECLIBLSTENECASCIILSTNECASCIILSTNECASCIILSTNECASCIILSTLUSCBIOS $$$USCBIOS $$$USCBIOS $$$USCBIOS $$$USCBIOS $$$USCBIOS $$$USCBIOS $$$USCBIOS $$$USCBIOS $$$USCBIOS $$$ 0  * ;* * ;* Programmer: Suezawa/Ogawa/Shibayama * ;* Kozono/Takamura * SCBIOS.A86 Customized Basic I/O System V1 PAGE 2 ;| | bios_code equ 1200h ;start of LDBIOS  ;* Revisions : 1.107:0015;D * ;* * ;********************************************* ; '83 07/07 FFFF  ccp_offset equ 0003h ;base of CPMLOADER bdos_ofst equ 0406h ;stripped BDOS entry ;| | ;----------------------------------- TRUE EQU -1 ; LOADER BIOS=0 ,CPM BIOS=-1 0000 false equ not true 000D cr equ 0dh ;carriage return 000A lf equ 0ah ;li---------- ENDIF ;loader_bios cseg org ccpoffset ccp: org bios_code CP/M ASM86 1.1 Sne feed ;********************************************* ;* * ;* Loader_bios is true if assembling the * ;* LOOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 3 EJECT ;********************************************* ;* ADER BIOS, otherwise BIOS is for the * ;* CPM.SYS file. * ;* * ;******************************************** * ;* BIOS Jump Vector for Individual Routines * ;* * ;********************************************* 25* 0000 loader_bios equ false 00E0 bdos_int equ 224 ;reserved BDOS interrupt 00DC CALENDAR_INT EQU 220 00DC MELODY_INT EQU 220 00 E9FD00 2600 jmp INIT ;Enter from BOOT ROM or LOADER 2503 E98505 2A8B jmp WBOOT ;Arrive here from BDOS call 0 2506 E9B905 2AC2 jmp CONST ;return console keyboard status 2509 E9DB05 2AE7 jmp CONIN ; CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 1 title 'Customized Basic I/O System V1.107:015;A' ;******************* IF not loader_bios ;--------------------------------------------- ;| | 2500 bios_code equ 2500h 2560 return console keyboard char 250C E99B0D 32AA jmp CONOUT ;write char to console device 250F E9BA17 3CCC jmp LISTOUT ;write character to list device 2512 E94322 4758 jmp PUNCH ;write character to punch device 2515 E9************************** ;* * ;* This Customized BIOS adapts CP/M-86 to * ;* the following hardware configuration *  SFKEYADDR_OFFSET EQU 2560H 0000 ccp_offset equ 0000h 0B06 bdos_ofst equ 0B06h ;BDOS entry point ;| | ;--5622 476E jmp READER ;return char from reader device 2518 E95325 4A6E jmp HOME ;move to trk 00 on cur sel drive 251B E9E623 4904 jmp SELDSK ;select disk for next rd/write 251E E91526 4B36 jmp SETTRK ;set ;* Processor: 8086 * ;* Brand: * ;* Controller: * ;* ------------------------------------------- ENDIF ;not loader_bios IF loader_bios ;--------------------------------------------- CP/M ASM86 1.1 SOURCE: U  track for next rd/write 2521 E95126 4B75 jmp SETSEC ;set sector for next rd/write 2524 E99F26 4BC6 jmp SETDMA ;set offset for user buff (DMA) 2527 E9AA26 4BD4 jmp READ ;read a 128 byte sector 252A E9F226 4CFSET KBSAD0 257C 0000 GDCSADSEG DW 0 257E 0000 GRFSADADDR DW 0 2580 RW 3 2586 00 ALTRBYTFLG DB 0 ; AUXCG FLAG not part of the BIOS, but need to locate these bios items ; *** in order to work. *** RMG / NECIS *** 9-9-83 ; ; 2592 1860 stslineaddr dw offset statusline 1F jmp WRITE ;write a 128 byte sector 252D E9D319 3F03 jmp LISTST ;return list status 2530 E98226 4BB5 jmp SECTRAN ;xlate logical->physical sector 2533 E99526 4BCB jmp SETDMAB ;set seg base for buff (DMA) 2536 ; BIT 0 ASCII MODE ; 1 AUXCG 1 CHR. OUT ; 2 AUXCG CONTINUE OUT  ; *** RMG / NECIS *** 9-9-83 2594 0000 stslineseg dw 0 ; *** RMG / NECIS *** 9-9-83 ; 2596 833B kbscropataddr dw offset bsc010 ; *** RMG / NECIS ** E99726 4BD0 jmp GETSEGT ;return offset of Mem Desc Table 2539 E9A223 48DE jmp GETIOBF ;return I/O map byte (IOBYTE) 253C E9A423 48E3 jmp SETIOBF ;set I/O map byte (IOBYTE) ;------------------ ; 3 AUXCG OUT BY ALT KEY ; 4 - 6 NOT USE ; 7 BDOS & BIOS ERROR MESSAGE OUT BIT 2587 80 * 9-9-83 2598 0000 kbscropatseg dw 0 ; *** RMG / NECIS *** 9-9-83 ; 259A CE3B crtdspaddr dw offset crtdsp ; *** RMG / NECIS *** 9-9-83 259C 0000 --------------------------- ; 253F E9A22C 51E4 JMP NULL 2542 E99F2C 51E4 JMP NULL 2545 E99C2C 51E4 JMP NULL 2548 E9992C 51E4 JMP NULL 254B E9962C 51E4 JMP NULL 254E E9932C 5 IOBYTE DB 80H ; I/OBYTE ;-------------------------------------------------------------- 2588 01 FDRAWF DB 1 ; FD READ AFTER WRITE FLAG --- '83 02/22 ---- 2589 00  crtdspseg dw 0 ; *** RMG / NECIS *** 9-9-83 ; 259E 1230 displaystsaddr dw offset dispstatus ; *** RMG / NECIS *** 9-9-83 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 C1E4 JMP NULL 2551 E9902C 51E4 JMP NULL 2554 E98D2C 51E4 JMP NULL 2557 E98A2C 51E4 JMP NULL 255A E98A30 55E7 JMP FUNCT_50 ;direct bios call (function# 50) ; ORG S DB 0 ; 0 = READ AFTER WRITE ; 1 = NON READ AFTER WRITE (DEFAULT) ; ; *** The following system table items hustomized Basic I/O System V1 PAGE 5 25A0 0000 displaystsseg dw 0 ; *** RMG / NECIS *** 9-9-83 ; ; SYSTEM DFKEYADDR_OFFSET 2560 005A SFKEYADDR DW OFFSET SFKEYTBL 2562 0000 SFKEYSEG DW 0 2564 C05C AUTSTRADDR DW OFFSET AUTSTRTBL 2566 0000 AUTSTRSEG DW 0 2568 ave been added to make all necessary ; *** utility items accessable in a version independent manner. ; *** RMG / NECIS *** 9-12-83 ; 258A A225 sysunitidaddr dw EVICE INFORMATIONS 25A2 00 SYSUNITID DB 00H ; DEVICE A 25A3 01 DB 01H ; DEVICE B 25A4 02 DB 02H ; D25C PRTCNVADDR DW OFFSET TBLWORK 256A 0000 PRTCNVSEG DW 0 ;--------------- *R1.107 4/13/'83 ---------------------------- CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O offset sysunitid ; *** RMG / NECIS *** 9-12-83; 258C 0000 sysunitidseg dw 0 ; *** RMG / NECIS *** 9-12-83; ; 258E FA25 biosveraddr dw offset biosver  DEVICE C 25A5 03 DB 03H ; DEVICE D 25A6 40 DB 40H ; DEVICE E 25A7 41 DB 41H ; DEVIC System V1 PAGE 4 256C F45D SPCTBLADDR DW OFFSET SPCTBL 256E 7A5E ASCTBLADDR DW OFFSET ASCTBL 2570 0000 KBSEG DW 0 2572 0000  ; *** RMG / NECIS *** 9-12-83 2590 0000 biosverseg dw 0 ; *** RMG / NECIS *** 9-12-83 ; ; *** Following additional system table items provide access to lE F 25A8 52 DB 52H ; DEVICE G 25A9 53 DB 53H ; DEVICE H 25AA FF DB 0FFH ; DEVICE I  DW 0 2574 0000 DW 0 2576 8061 U_AUXCGADDR DW OFFSET U_AUXCGTBL 2578 0000 U_AUXCGSEG DW 0 257A E164 GDCSADADDR DW OFocations ; *** needed to permit 1) user control of status line use; 2) repositioning ; *** of status line to bottom (26th line) of screen. The routines needed ; *** to do this are  25AB FF DB 0FFH ; DEVICE J 25AC FF DB 0FFH ; DEVICE K 25AD FF DB 0FFH ; DEVICE L 25AE FF 723 ; END OF CYLINDER 25C2 1800 HDFT2 DW HDFTS2 ; NUMBER OF FREE CYLINDERS 0018 HDFTS2 EQU HDFTS ; ; CP/M ASM86 1.1 SOUR DB 1BH,'OT',0,0,0,0,0,0,0,0,0,0,0,0,0 000000000000 00000000 5B60 RB 16*16 5C60 1B4F55000000 DB 1BH,'OU',0,0,0,0,0,0,0,0,0,0,0,0,0 000000000000  DB 0FFH ; DEVICE M 25AF FF DB 0FFH ; DEVICE N 25B0 FF DB 0FFH ; DEVICE O 25B1 FF CE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 6 ; DRIVE = 3 25C4 D402 HDST3 DW 724 ; START OF CYLINDER 25C6 9F05 HDET3 00000000 5C70 1B4F56000000 DB 1BH,'OV',0,0,0,0,0,0,0,0,0,0,0,0,0 000000000000 00000000 5C80 1B4F57000000 DB 1BH,'OW',0,0,0,0,0,0,0,0,0,0,0,0,0 CP/M ASM86 1.1 SOURCE: USCBIOS.A8 DB 0FFH ; DEVICE P ; 00H - 03H FLOPPY DISK DEVICE ; 40H - 53H HARD DISK DEVICE ; 0FFH UNUSED  DW 1439 ; END OF CYLINDER 25C8 1800 HDFT3 DW HDFTS3 ; NUMBER OF FREE CYLINDERS 0018 HDFTS3 EQU HDFTS ; ; 6 Customized Basic I/O System V1 PAGE 7 000000000000 00000000 5C90 1B4F58000000 DB 1BH,'OX',0,0,0,0,0,0,0,0,0,0,0,0,0 000000000000 00000000 5CA0 1B4F5 ; ( IF DB7 = ON , DRIVE IS NOT AVAILABLE ) ; ; ; *** The Hard Disk Area must directly follow the Sysunitid table to remain ; *** accessable to CONFIG v ; ; ; *** Flag error at assembly time if preceding data has grown past 25fah ; *** RMG / NECIS *** 9-12-83 ; if 9000000 DB 1BH,'OY',0,0,0,0,0,0,0,0,0,0,0,0,0 000000000000 00000000 5CB0 1B4F5A000000 DB 1BH,'OZ',0,0,0,0,0,0,0,0,0,0,0,0,0 000000000000 00000000 ; ia the system table sysunidaddr entry! DO NOT ; *** insert any new data items here! *** RMG / NECIS *** 9-13-83 ; 25B2 HDADT EQU OFFSET $ ; HARD DISK AREA 00(offset $) GT 25fah mov cs,0 ; >>>>>> error! data preceding 'biosver' has grown past 25fah endif ORG 25FAH ;  5CC0 5355424D4954 AUTSTRTBL DB 'SUBMIT AUTSTRT',CR,0 204155545354 52540D00 5CD0 C05C AUTSTRPTR DW AUTSTRTBL ; ;--------------------------------------18 HDFTS EQU 24 ; DEFINITION TABLE ; DRIVE = 0 25B2 0800 HDST0 DW 8 ; START OF CYLINDER 25B4 D302 HDET0 DW 723  ; *** This item now accessable via a system table entry *** RMG / NECIS ; 25FA 52312E313037 biosver DB 'R1.107' ; *** RMG / NECIS *** 9-12-83 ; ------ = INCLUDE USLIDATA.LIB = ;**** '83/04/12 **** = ;******************************************************************** = ;* LIST USER T ; END OF CYLINDER 25B6 1800 HDFT0 DW HDFTS0 ; NUMBER OF FREE CYLINDERS 0018 HDFTS0 EQU HDFTS ; ; ; DRIVE = 1  ; DSEG ORG 5A00H 5A00 SFKEYTBL RB 16*16 5B00 1B4F4F000000 DB 1BH,'OO',0,0,0,0,0,0,0,0,0,0,0,0,0 000000000000 ABLE ( TABLE WORK & CONVERT DATA ) * = ;******************************************************************** = ; =5CD2 80 TBLWORK DB 80H ; USER SET PARITY APOINT =5CD3 00  25B8 D402 HDST1 DW 724 ; START OF CYLINDER 25BA 9F05 HDET1 DW 1439 ; END OF CYLINDER 25BC 1800 HDFT1 DW HDFTS1 ; NUMBER OF FREE CYLINDE00000000 5B10 1B4F50000000 DB 1BH,'OP',0,0,0,0,0,0,0,0,0,0,0,0,0 000000000000 00000000 5B20 1B4F51000000 DB 1BH,'OQ',0,0,0,0,0,0,0,0,0,0,0,0,0 000000000000 00000000 5B30  WORKSO DB 00H ; USER SET SO DATA =5CD4 00 WORKSI DB 00H ; USER SET SI DATA =5CD5 00 DB 0 ; DUMMY =5CD6 00 DB 0 RS 0018 HDFTS1 EQU HDFTS ; ; ; DRIVE = 2 25BE 0800 HDST2 DW 8 ; START OF CYLINDER 25C0 D302 HDET2 DW1B4F52000000 DB 1BH,'OR',0,0,0,0,0,0,0,0,0,0,0,0,0 000000000000 00000000 5B40 1B4F53000000 DB 1BH,'OS',0,0,0,0,0,0,0,0,0,0,0,0,0 000000000000 00000000 5B50 1B4F54000000   ; DUMMY =5CD7 00 DB 0 ; DUMMY = ; =5CD8 000102030405 SIDA1 DB 00H,01H,02H,03H,04H,05H,06H,07H 0607 =5CE0 08090A0B0C0D DB 08H,09H,BAH,0BBH,0BCH,0BDH,0BEH,0BFH BEBF =5D98 C0C1C2C3C4C5 DB 0C0H,0C1H,0C2H,0C3H,0C4H,0C5H,0C6H,0C7H C6C7 =5DA0 C8C9CACBCCCD DB 0C8H,0C9H,0CAH,0CBH,0CCH,0CDH,0CEH,0CFH CECF =5DA8 D0D1D2D3D4D5 ODA) 002A SICP2 EQU 2AH ; PORT2 INIT: ;print signon message and initialize hardware 2600 8CC8 mov ax,cs ;we entered with a JMPF so use 2602 8ED0 0AH,0BH,0CH,0DH,0EH,0FH 0E0F =5CE8 101112131415 DB 10H,11H,12H,13H,14H,15H,16H,17H 1617 =5CF0 18191A1B1C1D DB 18H,19H,1AH,1BH,1CH,1DH,1EH,1FH 1E1F =5CF8 202122232425 DB 20H,21H,2 DB 0D0H,0D1H,0D2H,0D3H,0D4H,0D5H,0D6H,0D7H D6D7 =5DB0 D8D9DADBDCDD DB 0D8H,0D9H,0DAH,0DBH,0DCH,0DDH,0DEH,0DFH DEDF =5DB8 E0E1E2E3E4E5 DB 0E0H,0E1H,0E2H,0E3H,0E4H,0E5H,0E6H,0E7H E6E7 =5DC0 mov ss,ax ;CS: as the initial value of SS:, 2604 8ED8 mov ds,ax ;DS:, 2606 8EC0 mov es,ax ;and ES: ;use local stack during initialization 2608 BCFB752H,23H,24H,25H,26H,27H 2627 =5D00 28292A2B2C2D DB 28H,29H,2AH,2BH,2CH,2DH,2EH,2FH 2E2F =5D08 303132333435 DB 30H,31H,32H,33H,34H,35H,36H,37H 3637 =5D10 38393A3B3C3D DB 38H,39H,3A E8E9EAEBECED DB 0E8H,0E9H,0EAH,0EBH,0ECH,0EDH,0EEH,0EFH EEEF =5DC8 F0F1F2F3F4F5 DB 0F0H,0F1H,0F2H,0F3H,0F4H,0F5H,0F6H,0F7H F6F7 =5DD0 F8F9FAFBFCFD DB 0F8H,0F9H,0FAH,0FBH,0FCH,0FDH,0FEH, mov sp,offset stkbase 260B FC cld ;set forward direction ;--------------------------------------------- ;| H,3BH,3CH,3DH,3EH,3FH 3E3F =5D18 404142434445 DB 40H,41H,42H,43H,44H,45H,46H,47H 4647 =5D20 48494A4B4C4D DB 48H,49H,4AH,4BH,4CH,4DH,4EH,4FH 4E4F =5D28 505152535455 DB 50H,51H,52H0FFH FEFF = ; = ; ;____________________________________________ CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 P | ; This is a BIOS for the CPM.SYS file. ; Setup all interrupt vectors in low ; memory to address trap 260C 1E push ds ;,53H,54H,55H,56H,57H CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 8 5657 =5D30 58595A5B5C5D DB 58H,59H,5AH,5BH,5CH,5DH,5EH,5FH 5E5F =5D38 6061626AGE 9 EJECT ;********************************************* ;* * ;* INIT Entry Point, Differs for Lsave the DS register ;-------R1.107 07/07/'83 DELETE --------------- 260D B80000 mov ax,0 2610 8ED8 mov ds,ax 2612 8EC0 mov es,ax ;set ES and DS to zero 36465 DB 60H,61H,62H,63H,64H,65H,66H,67H 6667 =5D40 68696A6B6C6D DB 68H,69H,6AH,6BH,6CH,6DH,6EH,6FH 6E6F =5D48 707172737475 DB 70H,71H,72H,73H,74H,75H,76H,77H 7677 =5D50 78797A7BDBIOS and * ;* BIOS, according to "Loader_Bios" value * ;* * ;*********************************************  ;setup interrupt 0 to address trap routine 2614 C7060000B52A mov int0_offset,offset int_trap 261A 8C0E0200 mov int0_segment,CS 261E BF0400 mov di,4 2621 BE0000 7C7D DB 78H,79H,7AH,7BH,7CH,7DH,7EH,7FH 7E7F = ; =5D58 808182838485 DB 80H,81H,82H,83H,84H,85H,86H,87H 8687 =5D60 88898A8B8C8D DB 88H,89H,8AH,8BH,8CH,8DH,8EH,8FH  CSEG $ ORG 2600H ; ; PIC PORT ADDRESS 0020 ICP1 EQU 20H ; MASTER PIC 8259A PORT1 0022 ICP2 EQU 2 mov si,0 ;then propagate 2624 B9FE01 mov cx,510 ;trap vector to 2627 F3A5 rep movs ax,ax ;all 256 interrupts ;BDOS offset to proper interrupt  8E8F =5D68 909192939495 DB 90H,91H,92H,93H,94H,95H,96H,97H 9697 =5D70 98999A9B9C9D DB 98H,99H,9AH,9BH,9CH,9DH,9EH,9FH 9E9F =5D78 A0A1A2A3A4A5 DB 0A0H,0A1H,0A2H,0A3H,0A4H,0A5H,0A6H2H ; PORT2 0028 SICP1 EQU 28H ; SLAVE PIC PORT1 00E7 PICMASK EQU 0E7H ; (SLAVE,OP3,OP2,KB,TIMER,OP1,SIO1,ASOP) ; 1 1 1  ; KB & TIMER INTERRUPT VECTER SET 2629 C70690004C2D MOV INTKB_OFFSET,OFFSET INTKB 262F C7068C00662E MOV INTTM_OFFSET,OFFSET INTTM CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 ,0A7H A6A7 =5D80 A8A9AAABACAD DB 0A8H,0A9H,0AAH,0ABH,0ACH,0ADH,0AEH,0AFH AEAF =5D88 B0B1B2B3B4B5 DB 0B0H,0B1H,0B2H,0B3H,0B4H,0B5H,0B6H,0B7H B6B7 =5D90 B8B9BABBBCBD DB 0B8H,0B9H,00 0 1 1 1 ; 1=MASK ON ,0=MASK OFF ; NOTE: SLAVE PIC MASK ; (APU,OP7,OP6,FD,CRT/GRAPH,OP5,OP4,  PAGE 10 2635 C7067003453F MOV EXT_FNC_INT_OFFSET,OFFSET EXT_FNC_INT 263B C7068003060B mov bdos_offset,bdos_ofst 2641 1F pop ds ;restore the DS regi ; MELODY S/W INITIALIZATION 266E B206 MOV DL,06H 2670 E87920 46EC CALL MLOUT ; OUT INITIAL CONTOROL COMMAMD ; ; GDC S/W INITIALIZATION 2673 E8 AL,90H 26C5 E66C OUT SODAW2,AL ; SET IRT AND MASK 26C7 B90300 MOV CX,03H ; SET LOOP TIME INIT010: 26CA E2FE 26CA LOOP INIT010 ; IDLE ster ; (additional CP/M-86 initialization) ; ; PIC INITIALIZATION 2642 B011 MOV AL,11H ; MASK PIC 2644 E620 1D15 3B93 CALL KBMOUT ; MULTI COMMAND OUTPUT 2676 0B DB 0BH 2677 0042 DW 4200H ; SYNC SET 2679 1040 DW 4010H 267B 4E40 LOOP (10 U/S) 26CC B00E MOV AL,0EH 26CE E66E OUT SODAW1,AL ; MASK PIC 26D0 B0E7 MOV AL,PICMASK 26D2 E622 OUT IC OUT ICP1,AL ; ICW1 2646 B020 MOV AL,20H ; 2648 E622 OUT ICP2,AL ; ICW2 264A B080 MOV AL,80H 264C E622 OUT ICP2,AL  DW 404EH 267D 4F40 DW 404FH ; *R1.131 '82 12/22 267F 1A40 DW 401AH CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 P2,AL 26D4 B0FF MOV AL,0FFH 26D6 E62A OUT SICP2,AL ;---------------- R1.132 '83 02/26 --------------- ; FDC SPECIFY  ; ICW3 264E B001 MOV AL,01H 2650 E622 OUT ICP2,AL ; ICW3 ; ; SLAVE PIC INITIALIZATION NOTE ; ICW1=11 PAGE 11 2681 0640 DW 4006H ; *R1.131 '82 12/22 2683 1340 DW 4013H 2685 EE40 DW 40EEH 2687 4540 DW 4045H 2689 4742  ; SRT = 4 MSEC ; HUT = 176 MSEC ; HLT = 50 MSEC ; 26D8 BBA268 MOV BX,OFFSET FDC_SPECIFY 26DB FC H,ICW2=28H,ICW3=07H,ICW4=01H ; ; TIMER INITIALIZE ; 2652 B030 MOV AL,30H ; MODE 0 (INTERRUPT BY COUNT END) 2654 E62F OUT DW 4247H ; PITCH WRITE 268B 5040 DW 4050H 268D E8DD14 3B6D CALL KBSCRO ; SCROLL CMD OUTPUT 2690 B80000 MOV AX,00H 2693 BA0020 MOV  CLD 26DC E8CC2A 51AB CALL SENDCOM ;------------------------------------------------- CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 P 2FH,AL ; WRITE MODE (COUNTER 0) 2656 B004 MOV AL,04H ; 2658 E646 OUT 46H,AL ; 265A BA2900 MOV DX,29H ; DX=PORT NO. 265D 2AC0  DX,2000H 2696 B9FF0F MOV CX,0FFFH 2699 E84D15 3BE9 CALL KBCRTC ; DATA CLEAR 269C B80010 MOV AX,1000H 269F BA8000 MOV DX,0080H 26A2 B9FF0F AGE 12 = INCLUDE HDINIT.LIB CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 13 = EJECT =  SUB AL,AL 265F EE OUT DX,AL 2660 B0F0 MOV AL,0F0H 2662 EE OUT DX,AL ; TIMER = 25 MS ; ; CALEN MOV CX,0FFFH 26A5 E84115 3BE9 CALL KBCRTC ; ATTRIBUTE RESET 26A8 C606DB6400 MOV LA,00H 26AD C606DC6400 MOV CA,00H 26B2 B85000 MOV AX,50H ; CSEG $ = ; '83 02/17 = ;*************************************************************** = ;* * = DAR INITIALIZE 2663 B258 MOV DL,CLKPOT 2665 B005 MOV AL,MODCAN ; TEST MODE CANCEL 2667 EE OUT DX,AL 2668 0C08 OR AL,CLKSTB1 ; STB 1  *R1.133 '83 03/10 26B5 E89614 3B4E CALL KBCSRO ; COUSOR OUTPUT 26B8 E8FC14 3BB7 CALL KBCSRD ; COUSOR DISPLAY ; LIST INITIALIZATION 26BB B094  ;* HARD DISK INITIALIZE AND MAKE ERROR MAP ROUTINE * = ;* * = ;*************************************************************** = 266A EE OUT DX,AL ; WRITE MODE 266B 2407 AND AL,CLKSTB0 ; STB 0 266D EE OUT DX,AL ; WRITE COMMAND ;  MOV AL,94H 26BD E66E OUT SODAMD,AL ; LSI MODE SET 26BF B005 MOV AL,05H 26C1 E66E OUT SODAW1,AL ; SET INTE FLAG 26C3 B090 MOV   ; = HDINIT: =26DF BB2467 MOV BX,OFFSET HDDMA_RW =26E2 E8E72E 55CC CALL HDWDMA ; DMA REGISTER WRITE =26E5 E493 IN AL,HDD_TC 29 803F40 CMP BYTE PTR[BX],40H ; =272C 7508 2736 JNE HDINIT10 ; =272E F6470102 TEST BYTE PTR 1[BX],02H ; IF UNIT 0: IS READY =2732 74E7 271B JZ  ; =2776 3A06A168 CMP AL,HDNDISKS ; =277A 72C6 2742 JB NUNIT01 ; IF NEXT UNIT =277C 5D POP BP ; =277D 803ED46A00  ; DMA (LOW) READ =26E7 8AE0 MOV AH,AL =26E9 E493 IN AL,HDD_TC ; DMA (HIGH) READ =26EB 86C4 XCHG AL,AH =26ED 3DFF1F CMP AX,TCHD =26F0  HDINIT05 ; =2734 EB06 273C JMPS NUNIT ; = HDINIT10: =2736 C70627670000 MOV HDDMA_TC,0 ; NON ADPT SIGNE = ;------------------ CMP HDINITF,0 =2782 7419 279D JE NUNIT06 ; IF NOT READ ERROR =2784 2AE4 SUB AH,AH ; CLEAR AH =2786 BF416A MOV DI,OFFSET UNEMSG1 =2789 A0D467544 2736 JNE HDINIT10 ; IF NO ADAPT ---- '83 02/17 ---- =26F2 B000 MOV AL,00H =26F4 E694 OUT 94H,AL ; H/W RESET =26F6 E6A2 OUT ----------------------------------------- CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 14 = NUNIT: =273C 55 PUSH BP A MOV AL,HDINITF =278C D0E0 SHL AL,1 ; =278E 48 DEC AX ; =278F 03F8 ADD DI,AX =2791 BE486A MO HDFIR0,AL ; =26F8 B080 MOV AL,80H ; =26FA E6A2 OUT HDFIR0,AL ; =26FC B000 MOV AL,00H =26FE E6A2 OUT HDFIR ; =273D C606D36A00 MOV INITCNT,0 ; = NUNIT01: =2742 E88500 27CA CALL CHKDRV ; CHECK HARD DISK DRIVE =2745 80FA00 CMP DL,0 V SI,OFFSET UNEMSG2 =2794 B90E00 MOV CX,14 =2797 06 PUSH ES ; =2798 1E PUSH DS ; =2799 07 POP ES 0,AL ; =2700 E6A9 OUT HDD_CMD,AL ; DMA CMD WRITE =2702 B00E MOV AL,0EH =2704 E69F OUT HDD_AMSK,AL ; ALL MASK WRITE =2706 E496  ; =2748 7425 276F JE NUNIT04 ; IF NO DRIVE FOR THE UNIT =274A 8816D26A MOV NDRIVE,DL ; SAVE DRIVE COUNT =274E 833E276700 CMP HDDMA_TC,0 =2753 7463  ; =279A F3A5 REP MOVS AX,AX ; STRING COPY =279C 07 POP ES ; = NUNIT06: =279D E9BF01 295F JMP INIMEM00  IN AL,HDIRIN =2708 A840 TEST AL,40H =270A 740B 2717 JZ FMT_INIT ; IF FORMAT =270C C606096700 MOV HDFMTFG,00H ; FMT_FLAG RESET =2711 BB0A67  27B8 JE SETUNID ; NON ADPT =2755 E89D00 27F5 CALL HDHOM ; RECALIBRATE & SENSE UNIT STATUS =2758 3C00 CMP AL,0 =275A 755C 27B8 JNE SETUNID  ; END OF HARD DISK INITIALIZE = ; = ;************ ERROR ROUTINE 1 ***************** = HDREDER: =27A0 A0D36A MOV AL,INITCNT ; AL = UNIT NO. = MOV BX,HDCCMD =2714 E8622D 5479 CALL HDPIO ; DISK SPECIFY = FMT_INIT: =2717 B000 MOV AL,00H =2719 E698 OUT 98H,AL  ; IF ERROR UNIT = NUNIT02: =275C E8E000 283F CALL REDMAP ; ERROR MAP READ =275F 3C00 CMP AL,0 =2761 753D 27A0 JNE HDREDER ;27A3 0C30 OR AL,30H ; =27A5 2AED SUB CH,CH =27A7 8A0ED46A MOV CL,HDINITF CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1  ; HDIN / DMIN RESET = ;-------------------------- '83 02/17 ---------------------- = HDINIT05: =271B BB1E67 MOV BX,HDUNIT ; =271E E8582D 5479 CALL HDPIO  IF READ ERROR = NUNIT03: =2763 E83101 2897 CALL ERSET ; WRITE BIT MAP SET =2766 3C00 CMP AL,0 =2768 7536 27A0 JNE HDREDER ; IF READ E PAGE 15 =27AB D0E1 SHL CL,1 ; =27AD BB416A MOV BX,OFFSET UNEMSG1 =27B0 03D9 ADD BX,CX =27B2 8807 MOV [BX],AL = ; PHYSICAL I/O =2721 83FB00 CMP BX,0 ; FMT NON AVAIRABLE =2724 7410 2736 JE HDINIT10 ; =2726 802760 AND BYTE PTR[BX],60H ; =27RROR =276A C60632601C MOV HDMRK,1CH ; HDMARK SET = NUNIT04: =276F FE06D36A INC INITCNT ; INITIALIZE COUNT UP =2773 A0D36A MOV AL,INITCNT  27B4 FE06D46A INC HDINITF = SETUNID: =27B8 8BF5 MOV SI,BP ; =27BA 8A0ED26A MOV CL,NDRIVE ; =27BE 2AED SUB  ; ADDRESS SAVE =27EE 83C302 ADD BX,2 ; = CHKDRV2: =27F1 46 INC SI ; =27F2 E2EE 27E2 LOOP CHKDRV1 h =282F 750A 283B jne hdffer ; if error =2831 F6D4 not ah =2833 F6C41E test ah,1eh =2836 7503 283B jnz hdffer ; if error =2838 B00CH,CH ; = SETUNID1: =27C0 AD LODS SI ; =27C1 8BD8 MOV BX,AX ; =27C3 800F80 OR BYTE PTR[BX],80H  ; NEXT ID CHECK =27F4 C3 RET ; END = ; = ;********* HARD DISK RECALIBRATE & SENSE UNIT STATUS *********** = ; = 0 mov al,0 = homret: =283A C3 ret = ; = hdffer: =283B B0FF mov al,0ffh ; error return =283D EBF ; ERROR BIT ON =27C6 E2F8 27C0 LOOP SETUNID1 ; =27C8 EBA5 276F JMPS NUNIT04 ; = ; = ; = ;*********************** hdhom: =27F5 A0D36A mov al,initcnt ; unit no = al =27F8 8AE0 mov ah,al ; =27FA 0C50 or al,50h ; recalibrate cmd CP/M ASM86 1.1 B 283A jmps homret = ; = ;************************************************************** = ;* HARD DISK READ ERROR MAP SUBROUTINE * = ***************************************** = ;* CHECK DRIVE ID POINT AND DRIVE COUNT * = ;* OUTPUT : BP = ID ADDRESS SAVE POINT * = ;* SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 16 =27FC 80CC30 or ah,30h ; sense unit status cmd =27FF A21D67 mov rechd,al  ;* IN AL = UNIT NO. * = ;************************************************************** = ; = REDMAP: =283F A0D36A  : DL = DRIVE COUNT * = ;**************************************************************** = ; = CHKDRV: =27CA 8A26D36A MOV AH,IN ; unit and cmd set =2802 88261F67 mov hduncmd,ah ; unit and cmd set =2806 BB1C67 mov bx,hdhomer ; hdhomer address = bx =2809 E86D2C 5479 call hdpio  MOV AL,INITCNT =2842 B3B0 MOV BL,0B0H ; BL = READ CMD =2844 0AC3 OR AL,BL ; AL = READ CMD + UNIT NO. =2846 A21567 MOV HDRWCMD,AL = ITCNT ; UNIT NO. =27CE B104 MOV CL,4 ; =27D0 D2E4 SHL AH,CL ; =27D2 80CC40 OR AH,40H ; AL = HDID =27D5 BEA225  ; physical i/o call =280C 83FB00 cmp bx,0 =280F 742A 283B je hdffer ; if not status point error =2811 8B07 mov ax,[bx] ; status read =2813 2460  oneread: =2849 C7062767FF00 mov hddma_tc,00ffh ; hd dma terminal counter =284F BB2467 MOV BX,HDDMA ; HARD DISK DMA PARAMETER SET =2852 C606246715 MOV HDDMA MOV SI,OFFSET SYSUNITID ; =27D8 BBD76A MOV BX,OFFSET ADDSET ; =27DB 8BEB MOV BP,BX ; =27DD 2AD2 SUB DL,DL ; COU and al,60h =2815 3C40 cmp al,40h =2817 7522 283B jne hdffer ; if error =2819 F6C480 test ah,80h =281C 741D 283B jz hdffer _RW,15H =2857 E8722D 55CC CALL HDWDMA =285A BB1467 MOV BX,HDIOCB ; OFFSET HARD DISK DATA CMD =285D E8192C 5479 CALL HDPIO ; PHYSICAL I/O CALL =2860 C7062767FF1F NTER RESET =27DF B91000 MOV CX,16 ; = CHKDRV1: =27E2 8A04 MOV AL,[SI] ; =27E4 24F0 AND AL,0F0H ; =27E6 3AC ; if error =281E BB1E67 mov bx,hdunit ; sens unit cmd pointer =2821 E8552C 5479 call hdpio ; physical i/o call =2824 83FB00 cmp bx,0 =2827 741 mov hddma_tc,tchd ; hd tc = 8k =2866 8A07 MOV AL,[BX] ; AL = STATUS =2868 2460 AND AL,60H CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 4 CMP AL,AH ; =27E8 7507 27F1 JNE CHKDRV2 ; NO MATCH =27EA FEC2 INC DL ; =27EC 8937 MOV [BX],SI 2 283B je hdffer ; if not status point error =2829 8B07 mov ax,[bx] ; status read =282B 2460 and al,60h =282D 3C40 cmp al,40  PAGE 17 =286A 3C40 CMP AL,40H =286C 7517 2885 JNE REMAPER ; IF READ ERROR =286E 1E PUSH DS =286F B8009C  ; IF NOT READ =28A9 8B4704 MOV AX,4[BX] ; AX = -P-SP- =28AC 3D5020 CMP AX,2050H =28AF 7404 28B5 JE ERSET02 ; IF NOT READ = ERSET0128DB 45 INC BP ; =28DC 55 PUSH BP ; =28DD 8B5402 MOV DX,2[SI] ; DX = END OF TRACK =28E0 42 INC  MOV AX,9C00H =2872 8ED8 MOV DS,AX ; HARD DISK ADDRESS =2874 07 POP ES ; =2875 06 PUSH ES ; SEGMENT =2876 B980: =28B1 B0FF MOV AL,0FFH =28B3 EB0E 28C3 JMPS ERSET04 ; IF ERROR RETURN = ERSET02: =28B5 E80C00 28C4 CALL WRTBIT ; WRITE ERROR MAP SUBRO DX ; DX = EOT + 1 =28E1 8B04 MOV AX,[SI] ; AX = START OF TRACK =28E3 8BD8 MOV BX,AX ; =28E5 50 PUSH AX 00 MOV CX,80H ; COUNTER =2879 BFE66B MOV DI,OFFSET R_W_BUFF2D =287C BE0000 MOV SI,0 =287F F3A5 REP MOVS AX,AX ; LOAD HARD DISK DAUTINE =28B8 83C502 ADD BP,2 ; NEXT DRIVE =28BB FE0ED26A DEC NDRIVE ; =28BF 75F4 28B5 JNZ ERSET02 ; =28C1 B000 MOV  ; =28E6 57 PUSH DI ; =28E7 1E PUSH DS ; =28E8 07 POP ES ; ES = DS =28E9 B103 MOV TA TO SYS =2881 1F POP DS =2882 B000 MOV AL,00H = READMAPRET: =2884 C3 RET = REMAPER: =2885 803E1A670C cmp lsn,0 AL,0 ; IF NO ERROR = ERSET04: =28C3 C3 RET = ; CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE CL,3 ; =28EB D3EB SHR BX,CL ; BX = START OF CYLINDER =28ED BEEE6B MOV SI,OFFSET R_W_BUFF2D+8 ; =28F0 03F3 ADD SI,BX ; =28F2ch =288A 7504 2890 jne onered ; if again read =288C B0FF MOV AL,0FFH ; ERROR END =288E EBF4 2884 JMPS READMAPRET ; RETURN = 18 = ;************************************************************** = ;* CONVERT ERROR BIT MAP & SET DISK SIZE MAX * = ;********************************************* 83C702 ADD DI,2 ; =28F5 B103 MOV CL,3 ; =28F7 D3E3 SHL BX,CL ; BX = CURRENT TRACK NUMBER =28F9 3BC3 CM onered: =2890 C6061A670C mov lsn,0ch ; sector count no = 13 =2895 EBB2 2849 jmps oneread = ; = ; = ;******************************************** = ; = ; --------------------*R1.131 '83 01/31-------------------- = WRTBIT: =28C4 06 PUSH ES ; =28C5 55 P AX,BX ; =28FB 7412 290F JE WRTB030 ; =28FD B90800 MOV CX,8 ; =2900 52 PUSH DX ; =2901 8BD0 ************************************** = ;* ERROR MAP SET ROUTINE * = ;***************************************************************** = ; =  PUSH BP ; =28C6 8BDD MOV BX,BP ; BX = HD SYSUNITID ADDRESS =28C8 8B1F MOV BX,[BX] ; =28CA 8A0F MOV CL,[BX]  MOV DX,AX ; =2903 AC LODS BYTE PTR SI ; = WRTB020: =2904 D0E0 SHL AL,1 ; =2906 43 INC BX  ERSET: =2897 BBE66B MOV BX,OFFSET R_W_BUFF2D ; ERROR MAP READ POINT =289A 8B07 MOV AX,[BX] ; AX = -E-R- =289C 3D4552 CMP AX,5245H =289F 7510  ; CL = UNIT ID =28CC 81E10F00 AND CX,000FH ; CL = DRIVE NUMBER =28D0 51 PUSH CX ; SAVE DRIVE NUMBER =28D1 E88221 4A56 CALL GETPMAP  ; =2907 49 DEC CX ; =2908 3BD3 CMP DX,BX ; =290A 75F8 2904 JNE WRTB020 ; =290C 5A  28B1 JNE ERSET01 ; IF NOT READ =28A1 8B4702 MOV AX,2[BX] ; AX = -M-A- =28A4 3D4D41 CMP AX,414DH =28A7 7508 28B1 JNE ERSET01  ; GET ERROR MAP POINT =28D4 8A4404 MOV AL,4[SI] ; FREE SPACE SIZE (TRACKS) =28D7 2AE4 SUB AH,AH ; =28D9 8BE8 MOV BP,AX ; =  POP DX ; =290D EB04 2913 JMPS WRTB040 ; = WRTB030: =290F B90800 MOV CX,8 ; =2912 AC LODS BYTE PTR SI  SUB BX,DX ; BX = NUMBER OF AVAILABLE TRACKS =2940 8BC3 MOV AX,BX ; =2942 BB1A00 MOV BX,26 ; =2945 F7E3 MUL BX = INIMEM00: =295F BB0020 MOV BX,2000H = INIMEMCHK0: = ; CHECK MEMORY SIZE BY 128 K BYTES =2962 E84900 29AE CALL MEMCHKRTN =2965 3C00  ; = WRTB040: CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 19 =2913 3BD3 CMP DX,BX ; IF OVER EOT =291 ; =2947 B105 MOV CL,5 ; =2949 D3E8 SHR AX,CL ; =294B 48 DEC AX ; AX = (DX*26)/32-1 =294C BE7472  CMP AL,0 =2967 7532 299B JNE INIMEMCHK4 =2969 81C30020 ADD BX,2000H =296D 81FB0080 CMP BX,8000H =2971 7402 2975 JE INIMEMCHK1 =2973 EBED 2962 5 741B 2932 JE WRTB070 ; =2917 0AC0 OR AL,AL ; =2919 740F 292A JZ WRTB060 ; NON ERROR =291B D0E0 SHL AL,1  MOV SI,OFFSET HDDPE0 ; SI = HARD DISK DPE0 OFFSET =294F 5A POP DX ; DX = DRIVE NUMBER =2950 B104 MOV CL,4 ; =2952 D3E2  JMPS INIMEMCHK0 = ;---------* R1.133 '83/03/08 *-------------------------------- = INIMEMCHK1: =2975 BEFEFF MOV SI,MEMCHKADE ; CHECK MEMORY ADDRESS =  ; =291D 7308 2927 JNB WRTB050 ; =291F 4D DEC BP ; =2920 7410 2932 JZ WRTB070 ; ERROR MAP FULL =2922 891D  SHL DX,CL ; DX = DRIVE*16 =2954 03F2 ADD SI,DX ; SI = HARD DISK DPE DRIVE POINT =2956 8B5C0A MOV BX,10[SI] ; =2959 894705 MOV  INIMEMCHK2: =2978 06 PUSH ES ; SAVE SEGMENT =2979 8EC3 MOV ES,BX ; CHECK SEGMENT =297B 26C7045AA5 MOV ES:[SI],MEMCHKWD ; =2980 268 MOV [DI],BX ; BAD TRACK NUMBER SET =2924 83C702 ADD DI,2 ; = WRTB050: =2927 43 INC BX ; =2928 E2E9 291 5[BX],AX ; SET DISK SIZE MAX =295C 5D POP BP ; =295D 07 POP ES ; =295E C3 RET ; = B04 MOV AX,ES:[SI] ; AX = CHECK DATA =2983 07 POP ES =2984 3D5AA5 CMP AX,MEMCHKWD ; =2987 7512 299B JNE INIMEMCHK4 ; IF N3 LOOP WRTB040 ; = WRTB060: =292A 03D9 ADD BX,CX ; =292C 3BDA CMP BX,DX ; =292E 72DF 290F JB WRT ; = ; --------------------------------------------------------- ; = INCLUDE MEMCHK.LIB = ; '83/03/08 = ;*******OT MEMORY =2989 81FB0090 CMP BX,9000H =298D 7409 2998 JE INIMEMCHK3 ; IF END ROUTINE =298F 81C30010 ADD BX,1000H ; SEGMENT UP =2993 BEFEBF MOVB030 ; =2930 8BDA MOV BX,DX ; = WRTB070: =2932 5F POP DI ; =2933 58 POP AX ************************************************* = ;* MEMORY SIZE CHECK * CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE  SI,0BFFEH ; MEMORY CHECK ADDRESS =2996 EBE0 2978 JMPS INIMEMCHK2 = INIMEMCHK3: =2998 BB009C MOV BX,MEMMAXSIZE ; BX = 9C00H = ;-----------; AX = START OF TRACK =2934 59 POP CX ; CX = NUMBER OF FREE TRACKS =2935 8BD1 MOV DX,CX ; =2937 4A DEC DX ; =2938 20 = ;* 128 K (MIN)/256 K / 384 K / 512 K * = ;* . SET MEMORY LENGTH TO SEG_TABLE * = ;************************************************-------------------------------------------------- = INIMEMCHK4: =299B 81EB0020 SUB BX,2000H =299F 81C30018 ADD BX,TPA_LEN =29A3 8BC3 MOV AX,BX =29A5 BBE76D  2BCD SUB CX,BP ; CX = NUMBER OF BAD TRACKS =293A 890D MOV [DI],CX ; =293C 2BD8 SUB BX,AX ; EOT - SOT =293E 2BDA ******** = A55A MEMCHKWD EQU 0A55AH = 0000 MEMCHKADS EQU 0 = FFFE MEMCHKADE EQU 0FFFEH = 9C00 MEMMAXSIZE EQU 9C00H ; --*'83/03/08 --   MOV BX,OFFSET SEG_TABLE =29A8 894703 MOV 3[BX],AX =29AB E93400 29E2 JMP INIMEMCHKEND = ; = ; = MEMCHKRTN: =  JE INITGDC ; IF HARD DISK NOT READ ERROR 29EF BB2D6A MOV BX,OFFSET UNEMSG 29F2 E8F41E 48E9 CALL PMSG INITGDC: 29F5 B9FFFF mov cx,0FFFFH ;IDLEF and al,0fh ; 2A2F A2D36A mov initcnt,al ; hard disk unit No. 2A32 E895FD 27CA call chkdrv ; hard disk drive check 2A35 80FA00 cmp dl,0  ; INPUT BX = MEM SEGMENT ADDRESS = ; OUTPUT AL=0 ; NORMAL (MEM EXIST) = ; =-1 ; ERROR (MEM NOT EXIST) = ; = ; . CHECK BX:0000H & (B LOOP 228ms INITGDCEND: 29F8 E2FE 29F8 loop INITGDCEND 29FA B06B mov al,6bh 29FC E642 out 42h,al ; disp start ;--------------*R 1 ; not ready hard disk unit drive 2A38 7411 2A4B je hdload01 ; if dl = 0 then hlt 2A3A E85100 2A8E call chklod ; loader on load dirve check 2A3D 80FA00 X+1000H):FFFEH ADDRESS CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 21 = ; PERFORM READ AFTER WRITE WITH CHECK DATA (WD) = ; .131,'83/02/24-------------- 29FE 06 push es ; coldstart drive No. search 29FF BB0010 mov bx,1000h ; 2A02 8EC3 mov es,bx ; es = segmant  cmp dl,0 2A40 7409 2A4B je hdload01 ; if dl = 0 then hlt 2A42 5D pop bp 2A43 8ACA mov cl,dl ; cl = currnt drive No. startdrv:  =29AE 06 PUSH ES =29AF 53 PUSH BX =29B0 8EC3 MOV ES,BX =29B2 BB0000 MOV BX,MEMCHKADS =29B5 26C7075AA5 MOV ES:[BX],MEMCHKWD =29BA 26 2A04 BBFFFF mov bx,0ffffh ; es:[bx] = loader flag address 2A07 268A07 mov al,es:[bx] ; al = loader flag 2A0A 07 pop es ; 2A0B 2AC9 2A45 880EB724 mov byte ptr .sysdrv,cl ; dl = start drive No. 2A49 EB08 2A53 jmps initseg ;-------- if hard disk is not defined msg ---*'83/02/25 hdload01: 2A4B 8B07 MOV AX,ES:[BX] =29BD 3D5AA5 CMP AX,MEMCHKWD =29C0 751B 29DD JNE MEMCHKERR =29C2 8CC0 MOV AX,ES =29C4 050010 ADD AX,1000H =29C7 8EC0 sub cl,cl ; clear cl CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 22 2A0D A8EC test al,0ech ; 2A0F 7542 2A53 jnz 5D pop bp 2A4C BB646A mov bx,offset notdefmsg 2A4F E8971E 48E9 call pmsg 2A52 F4 hlt  MOV ES,AX ; SET NEXT SEGMENT =29C9 BBFEFF MOV BX,MEMCHKADE =29CC 26C7075AA5 MOV ES:[BX],MEMCHKWD =29D1 268B07 MOV AX,ES:[BX] =29D4 3D5AA5  initseg ; if drive a: coldstart 2A11 3C10 cmp al,10h ; 2A13 7317 2A2C jae hdloader ; if hard disk coldstart 2A15 BBA225 mov bx,offset sysunitid ; id offset ;--------------------------------------------*'83/02/25 ;default to dr A: on coldstart INITSEG: 2A53 8CD8 MOV AX,DS 2A55 2EA36225 MOV SFKEYSEG,AX  CMP AX,MEMCHKWD =29D7 7504 29DD JNE MEMCHKERR =29D9 32C0 XOR AL,AL =29DB EB02 29DF JMPS MEMCHKRTNRET = MEMCHKERR: =29DD 0CFF OR AL 2A18 8BD3 mov dx,bx ; 2A1A B91000 mov cx,16 ; counter fdlod00: 2A1D 3A07 cmp al,[bx] ; 2A1F 7405 2A26 je ; SET SOFT KEY TABLE SEGMENT ADDRESS 2A59 2EA36625 MOV AUTSTRSEG,AX ; SET AUTOSTART TABLE SEGMENT ADDRESS 2A5D 2EA36A25 MOV PRTCNVSEG,AX ; SET LIST OUT TABLE SEGMENT ADDRESS ;-,0FFH = MEMCHKRTNRET: =29DF 5B POP BX =29E0 07 POP ES =29E1 C3 RET = INIMEMCHKEND: = = = ;---------- fdlod01 2A21 43 inc bx 2A22 E2F9 2A1D loop fdlod00 ; if next cmp 2A24 EB2D 2A53 jmps initseg ; if drive a: coldstart fdlod01: 2A26 2BDA --------------* R1.107 4/27/'83 ------------------------------------- 2A61 2EA37025 MOV KBSEG,AX ; SET KEY BOARD TABLE SEGMENT ADDRESS 2A65 2EA37C25 MOV GDCSADSEG,AX ; SET GDC MEMORY TABLE SEGMENT ADD---------------------------------------- 29E2 BBE26A mov bx,offset signon 29E5 E8011F 48E9 call pmsg ;print signon message 29E8 803ED46A00 CMP HDINITF,0 29ED 7406 29F5  sub bx,dx ; 2A28 8ACB mov cl,bl 2A2A EB19 2A45 jmps startdrv hdloader: 2A2C 55 push bp ; save bp 2A2D 240 RESS 2A69 2EA37825 MOV U_AUXCGSEG,AX ; SET UNIVERSAL CG TABLE SEGMENT ADDRESS ;---------------------------------------------------------------------- ; *** New system table segment 8B1C MOV BX,[SI] ; BX = ID ADDRESS 2A96 8A07 MOV AL,[BX] ; AL = ID DATA 2A98 8BD3 MOV DX,BX ; SAVE ID ADDRESS 2A9A 80F901  * ;* CP/M Character I/O Interface Routines * ;* * ;********************************************* items *** RMG / NECIS *** 9-9-83 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 23 2A6D 2EA39425 mov stslineseg,ax ; *** RMG / NECIS *** 9-9-83 2A71 2EA CMP CL,1 ; 2A9D 7411 2AB0 JE CHKLOD03 ; IF LOAD POINT CHKLOD01: 2A9F 83C602 ADD SI,2 ; HARD DISK ID POINT UP  ;----------------------------------------------- = INCLUDE USCONIN.LIB = ; '83 05/28 = ; = ; KB EQU TABLE = 38C25 mov sysunitidseg,ax ; *** RMG / NECIS *** 9-12-83 2A75 2EA39025 mov biosverseg,ax ; *** RMG / NECIS *** 9-12-83 2A79 8CC8 mov ax,cs ; *** RMG / NECIS *** 9-9- 2AA2 8B1C MOV BX,[SI] ; NEXT ID ADDRESS 2AA4 8A27 MOV AH,[BX] ; NEXT ID DATA 2AA6 3AC4 CMP AL,AH ; 2AA8 7204 2AAE  ; = 004A KBSTP EQU 4AH ; KB STATUS PORT = 0048 KBINP EQU 48H ; KB DATA INPUT PORT = 004C KBSWP EQU 4CH ; KB READ SIGNAL PORT = 004E KBSFP EQU 83 2A7B 2EA39825 mov kbscropatseg,ax ; *** RMG / NECIS *** 9-9-83 2A7F 2EA39C25 mov crtdspseg,ax ; *** RMG / NECIS *** 9-9-83 2A83 2EA3A025 mov displaystsseg,ax ; *** RMG / NEC JB CHKLOD02 ; IF AL < AH THEN AFTER CHECK 2AAA 8AC4 MOV AL,AH ; AL > AH = LOAD AL,AH 2AAC 8BD3 MOV DX,BX ; SAVE ADDRESS  4EH ; KB READ SHIFT PORT = ;********************************************** = ;* * = ;* CONST (CONSOLE STATUS) * = IS *** 9-9-83 ; 2A87 FB STI ; ENABLE INTERRUPT 2A88 E975D5 0000 jmp ccp ;jump to cold start entry of CCP 2A8B E978D5 0006 WBOOT: jmp ccp+6  CHKLOD02: 2AAE E2EF 2A9F LOOP CHKLOD01 ; AFTER CHECK CHKLOD03: 2AB0 81EAA225 SUB DX,OFFSET SYSUNITID ; DL = ON LOADER DRIVE 2AB4 C3 RE ;* * = ;********************************************** = CONST: = ; CHECK DISABLE/ENABLE KEY BOARD INPUT =2AC2 803E606100 ;direct entry to CCP at command level ; ;---------------*R1.131,'83/02/25--------------- ;*************************************************************** T ;-------------------------------------------- int_trap: 2AB5 CF IRET ; *R1.131 '82 12/22 2AB6 FA cli ;block CMP SYSKEYINFLG,0 =2AC7 7517 2AE0 JNE CONST010 ; IF DISABLE KEY BOARD INPUT = ; CHECK IF SOFT KEY MODE =2AC9 803E596100 CMP SFKEYFLG,0 ; CHECK SOFTKEY MODE =2 ;* HARD DISK LOADER CHECH ROUTINE * ;* IN DL = DRIVE COUNT * ;* BP = SYSUNIT ID ADDERSS *  interrupts 2AB7 8CC8 mov ax,cs 2AB9 8ED8 mov ds,ax ;get our data segment 2ABB BB4D6B mov bx,offset int_trp CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O SystemACE 7514 2AE4 JNE CONST020 ; YES = ; CHECK IF KB FIFO = EMPTY ? =2AD0 A01661 MOV AL,KBIN =2AD3 3A061761 CMP AL,KBOUT =2AD7 750B 2AE4 JNE ;*************************************************************** ; 24B7 SYSDRV EQU 24B7H ; SYSTEM DRIVE ADDRESS ; CH V1 PAGE 24 2ABE E8281E 48E9 call pmsg 2AC1 F4 hlt ;hardstop ;-------------------------------------------- CP/M ASM86 1.1 CONST020 ; NOT EMPTY = ; CHECK REPEAT STATUS =2AD9 803ED85D00 CMP KBREPFLG,0 =2ADE 7504 2AE4 JNE CONST020 = CONST010: =2AE0 B000 MOV KLOD: 2A8E 2AED SUB CH,CH ; CLEAR CH 2A90 8ACA MOV CL,DL ; COUNTOR 2A92 8BF5 MOV SI,BP ; SI = HARD DISK ID POINT 2A94  SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 25 EJECT ;********************************************* ;*   AL,00H =2AE2 EB02 2AE6 JMPS CONST030 = CONST020: =2AE4 B0FF MOV AL,0FFH ; READY TO GET DATA = CONST030: =2AE6 C3 RET = N019 = ; GET KEY IN DATA FROM KB FIFO BUFFER = CONIN018: =2B2A E86A00 2B97 CALL KBGET = CONIN019: =2B2D E89300 2BC3 CALL CODCHNG ; DATA CHECK ; CHECK IF ROLL DOWN WAS OCCURED =2B70 803ED96400 CMP ROLDCNT,0 =2B75 741B 2B92 JE CONINRET =2B77 50 PUSH AX =2B78 2AED SUB CH,CH =2B7A 8A0ED96 ;********************************************* = ;* * = ;* CONIN (CONSOLE INPUT) * = ;*  AND CONV. =2B30 803E596100 CMP SFKEYFLG,0 =2B35 75B1 2AE8 JNE CONIN000 =2B37 80FA00 CMP DL,00H =2B3A 74AC 2AE8 JE CONIN000 = CONIN020: = 4 MOV CL,ROLDCNT = CONIN045: =2B7E E8530E 39D4 CALL ROLLUP =2B81 E2FB 2B7E LOOP CONIN045 =2B83 8A36DB64 MOV DH,LA =2B87 8A16DC64 MOV  * = ;********************************************* = CONIN: =2AE7 FC CLD = CONIN000: CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System ; CHECK FOR UPPER OR LOWER CASE OF ENGLISH LETTER =2B3C C606D95D00 MOV KBULFLG,0 =2B41 F6065D6180 TEST KBSW1,80H =2B46 7504 2B4C JNZ CONIN021 =2B48 FE06D95D  DL,CA =2B8B E8680F 3AF6 CALL KBLCCV =2B8E E8BD0F 3B4E CALL KBCSRO =2B91 58 POP AX = CONINRET: =2B92 8A265D61 MOV AH,KBSW1 ;AH=GENEREATE C V1 PAGE 26 = ; AUTO START PROC =2AE8 8B1ED05C MOV BX,AUTSTRPTR ; BX = AUTO START TABLE ADDR =2AEC 8A07 MOV AL,BYTE PTR[BX] ; AUTO STARTINC KBULFLG = CONIN021: = ;-------------- R1.107 '83 4/27 DELEAT ------------------------ =2B4C 3C41 CMP AL,41H =2B4E 7C20 2B70 JL CONIN030 ; IF NOT NOONTROLL DATA =2B96 C3 RET = ;********************************************************************** = ;* KBGET * =  MASAGE GET =2AEE 3C00 CMP AL,0 =2AF0 7408 2AFA JE CONIN00 ; IF NOTHING AUTO START MASAGE =2AF2 43 INC BX ; POINTER UP =2AF3 891ED05C MOV MAL (A-Z) KEY SHIFTED =2B50 3C5A CMP AL,5AH =2B52 7E13 2B67 JLE CONIN023 ; IF NOMAL (A-Z) KEY SHIFTED =2B54 3C61 CMP AL,61H =2B56 7C18 2B70 JL CONIN030  ;* GET KEY IN DATA FROM KB FIFO BUFFER * = ;********************************************************************** = KBGET: =2B97 51 PUSH C AUTSTRPTR,BX ; POINTER SAVE =2AF7 E99800 2B92 JMP CONINRET = CONIN00: = ; SOFT KEY PROC. =2AFA 803E596100 CMP SFKEYFLG,0 ; CHECK SOFTKEY =2AFF 7411 2B12 ; IF NOT NOMAL (A-Z) KEY UNSIFTED =2B58 3C7A CMP AL,7AH =2B5A 7F14 2B70 JG CONIN030 ; IF NOT NOMAL (A-Z) KEY UNSIFTED CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 X = =2B98 2AE4 SUB AH,AH =2B9A BB1861 MOV BX,OFFSET KBFIFO =2B9D A01761 MOV AL,KBOUT =2BA0 03D8 ADD BX,AX =2BA2 8A07 MOV AL,[BX]  JE CONIN010 ; MODE =2B01 8B1E5A61 MOV BX, SFKEYPTR =2B05 8A07 MOV AL,[BX] =2B07 FF065A61 INC SFKEYPTR =2B0B FE0E5961 DEC SFKEYFLG =2B0F  PAGE 27 = CONIN022: =2B5C 803ED95D00 CMP KBULFLG,0 =2B61 750D 2B70 JNE CONIN030 ; IF CAPS KEY UNLATCHED =2B63 2C20 SUB A ; GET CONTROL CODE =2BA4 A25D61 MOV KBSW1,AL =2BA7 8A4701 MOV AL,1[BX] ; GET DATA =2BAA A2EB5D MOV SVDATA,AL = ; MAINTENANCE KBOUT POINTER =2BAD E95E00 2B70 JMP CONIN030 = CONIN010: =2B12 E8ADFF 2AC2 CALL CONST =2B15 3C00 CMP AL,0 =2B17 74F9 2B12 JE CONIN010 =2B19 803ED85D00 CML,20H ; CODE CONVERT (SMALL <-- LARGE) =2B65 EB09 2B70 JMPS CONIN030 = CONIN023: =2B67 803ED95D00 CMP KBULFLG,0 =2B6C 7502 2B70 JNE CONIN030 ; IF CAPS KEY UB100 MOV CL,0 =2BAF 803E17613E CMP KBOUT,KBFIFOSZ-2 =2BB4 7407 2BBD JE KBGETRET =2BB6 8A0E1761 MOV CL,KBOUT =2BBA 80C102 ADD CL,2 = P KBREPFLG,0 =2B1E 740A 2B2A JE CONIN018 = ; REPEAT PROC =2B20 C606D85D00 MOV KBREPFLG,0 =2B25 A0EB5D MOV AL,SVDATA =2B28 EB03 2B2D JMPS CONINLATCHFD =2B6E 0420 ADD AL,20H ; CODE CONVERT (LARGE <-- SMALL) = CONIN030: = ; AND AL,7FH ; REMOVE PARITY BIT = CONIN040: =   KBGETRET: =2BBD 880E1761 MOV KBOUT,CL CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 28 =2BC1 59 POP CX =2BC2 C3  2BFE JE CDCNG030 =2BF7 FE065961 INC SFKEYFLG =2BFB 43 INC BX =2BFC EBF3 2BF1 JMPS CDCNG020 = CDCNG030: =2BFE 803E596100 CMP SFK ;* OUTPUT DL ; = 0 ERROR RETURN * = ;* = 255 NORMAL RETURN * = ;* AL = A RET = ;********************************************************************** = ;* KEY-IN DATA CHECK AND CHANGE ROUTINE * = ;* EYFLG,0 =2C03 7405 2C0A JE CDCNG040 =2C05 58 POP AX =2C06 B200 MOV DL,0 =2C08 EB23 2C2D JMPS CDCNGRET = ; = CDCNG0SCII CODE * = ;********************************************************************** = 0096 BSTOP EQU 96H ; BREAK-STOP KEY CODE = 009A CHOME EQU 9AH  * = ;* INPUT AL ; JIS8 CODE * = ;* OUTPUT DL ; = 0 : ERROR RETURN * = 40: =2C0A 58 POP AX =2C0B BBF45D MOV BX,OFFSET SPCTBL ; BX = SPECIAL KEY TABLE ADDR =2C0E B102 MOV CL,2 ; POINTER COUNT =2C10 E8F100 2D04  ; CLEAR-HOME KEY CODE = 0098 KBTAB EQU 98H ; TAB KEY CODE = 00FC KBDEL EQU 0FCH ; DEL KEY = 00FF KBPRNT EQU 0FFH ; PRINT KEY CODE R1.133 3/10 =  ;* = FF : NORMAL RETURN * = ;* AL = ASCII CODE * = ;****************************************** CALL KBTBLSRCH ; SPECIAL KEY TABLE SEARCH =2C13 80FA00 CMP DL,0 =2C16 7405 2C1D JE CDCNG050 ; IF NOT SPECIAL KEY =2C18 E81300 2C2E CALL SPCCNV  ; = 0001 FNCON EQU 01H ; KB SIGNALE (KBSW1) FNC = ON = 0002 CTLON EQU 02H ; CTRL = ON = 0040 SFTON EQU 40H ; **************************** = CODCHNG: =2BC3 2AE4 SUB AH,AH =2BC5 2AED SUB CH,CH = ; CHECK FUNCTION KEY (SOFT KEY) =2BC7 50  ; SPECIAL KEY CHECK AND CNVERT CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 29 =2C1B EB10 2C2D JMPS CDCNGRET = ; =  SHIFT = ON = ; = SPCCNV: =2C2E 3C96 CMP AL,BSTOP =2C30 751D 2C4F JNE SPC030 ; IF NOT BREAK-STOP KEY =2C32 F6065D6101 TE PUSH AX =2BC8 3D8000 CMP AX,80H =2BCB 723D 2C0A JB CDCNG040 =2BCD 3D9500 CMP AX,95H =2BD0 7F38 2C0A JG CDCNG040 ; IF NOT PF KEY =2B CDCNG050: =2C1D BB7A5E MOV BX,OFFSET ASCTBL ; BX = ASCII KEY TABLE ADDR =2C20 B108 MOV CL,8 ; POINTER COUNT =2C22 E8DF00 2D04 CALL KBTBLSRCH ; ASST KBSW1,FNCON =2C37 7400 2C39 JZ SPC010 ; IF FNC = OFF = ; (DELETE) *R1.131 '82 12/22 = ; =2C39 F6065D6102 SPC010: TEST KBSW1,CTLOND2 2C80 SUB AL,80H =2BD4 B104 MOV CL,4 =2BD6 D3E0 SHL AX,CL =2BD8 BB005A MOV BX,OFFSET SFKEYTBL =2BDB 03D8 ADD BX,AX =2BDD F6065CII KEY TABLE SEARCH =2C25 80FA00 CMP DL,0 =2C28 7403 2C2D JE CDCNGRET ; IF ERROR KEY-IN =2C2A E86C00 2C99 CALL ASCCNV ; ASCII KEY CHECK AND CONVERT =  =2C3E 750B 2C4B JNZ SPC020 ; IF CTRL = ON =2C40 F6065D6140 TEST KBSW1,SFTON =2C45 7504 2C4B JNZ SPC020 ; IF SHIFT = ON (SHIFT=CTRL) =2C47 B013 MOV ALD6101 TEST KBSW1,01H =2BE2 7404 2BE8 JZ CDCNG010 ; PF (1-16) =2BE4 81C36001 ADD BX,22*16 ; PF + FNC = CDCNG010: =2BE8 891E5A61  ; = CDCNGRET: =2C2D C3 RET = ; = ;********************************************************************** = ;* SPECIAL KEY,13H ; BREAK-STOP = CTL-S =2C49 EB4D 2C98 JMPS SPCRET =2C4B B003 SPC020: MOV AL,03H ; CTL+BREAK-STOP = CTL-C =2C4D EB49 2C98 JMPS SPCRET = ; =  MOV SFKEYPTR,BX ; INITIALIZE POINTER =2BEC C606596100 MOV SFKEYFLG,0 = CDCNG020: =2BF1 8A07 MOV AL,[BX] =2BF3 3C00 CMP AL,0 =2BF5 7407  CHECK AND CONVERT ROUTINE * = ;* INPUT AL ; SPECIAL KEY CODE * = ;* BX ; SPECIAL KEY TABLE ADDR * =   SPC030: =2C4F 3DF700 CMP AX,0F7H =2C52 7C11 2C65 JL SPC040 ; IF NOT CURSOR CONTROL KEY =2C54 3DFA00 CMP AX,0FAH =2C57 7F0C 2C65 JG SPC040 Y =2C91 B07F MOV AL,7FH ; RUBOUT CODE SET =2C93 EB03 2C98 JMPS SPCRET = ; =2C95 43 SPC060: INC BX =2C96 8A07 MOV AL,BYTE PTR[BX] = AX,30H =2CB8 7C0C 2CC6 JL ASC020 =2CBA 3D3900 CMP AX,39H =2CBD 7F07 2CC6 JG ASC020 ; IF NOT 0 - 9 KEY = ; OUTPUT SPEED CONTROL PROC. =2CBF 2C ; IF NOT CURSOR CONTROL KEY CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 30 = ; = ; *** Following modification permits unshifted (by  ; = SPCRET: =2C98 C3 RET = ;********************************************************************** = ;* ASCII KEY CHECK AND CONVERT 30 SUB AL,30H =2CC1 A2EC5D MOV SPDWK,AL =2CC4 EB3B 2D01 JMPS ASCERR = ;---------------*R1.107 '83 5/28 ------------------------------------------ = ctrl) cursor control keys = ; *** to be interpreted via the SPCTBL, rather than inline code in CSCNV2; = ; *** this permits user config via SPCTBL modification alone. = ; =2C59 F6065D610 * = ;* INPUT AL ; KEY-IN DATA CODE * = ;* BX ; ASCII KEY CODE TABLE ADDR * = ;*  ; =2CC6 8A4702 ASC020: MOV AL,2[BX] ; =2CC9 3D4100 CMP AX,41H =2CCC 7C33 2D01 JL ASCERR =2CCE 3D5E00 CMP AX,5EH =2CD1 7F2E 2D01 JG2 test kbsw1,02h ; CTRL key down? =2C5E 7435 2C95 jz spc060 ; if not, is "ordinary" special key... = ; = ; *** RMG / NECIS *** 9-9-83 =  OUTPUT DL ; = 0 ERROR RETURN * = ;* = 255 NORMAL RETURN * = ;* AL = ASCII CODE  ASCERR ; IF NOT A - Z KEY = ASC025: =2CD3 E85400 2D2A CALL KBCTRL ; CTRL + ASCII CARACTER KEY =2CD6 EB2B 2D03 JMPS ASCRET = ;------- ; =2C60 E8CA00 2D2D CALL CDCNV2 ; CURSOR CONTROL KEY CONVERT =2C63 EB33 2C98 JMPS SPCRET = ; = SPC040: =2C65 3C9A CMP AL,CHOME =2C * = ;********************************************************************** = ASCCNV: =2C99 F6065D6102 TEST KBSW1,CTLON =2C9E 7438 2CD8 JZ ASC030 ; I----------------------------------------------------------------- = ; =2CD8 8A0E5D61 ASC030: MOV CL,KBSW1 =2CDC 80E17F AND CL,7FH ; MASK CAPS LOCK =2CDF 53 67 7515 2C7E JNE SPC050 ; IF NOT CLEAR-HOME KEY =2C69 F6065D6102 TEST KBSW1,CTLON =2C6E 7507 2C77 JNZ SPC045 ; IF CTRL = ON =2C70 F6065D6140 TEST KBSW1,SFTON F CTRL KEY = OFF =2CA0 F6065D6140 TEST KBSW1,SFTON CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 31 =2CA5 740E 2CB5 JZ ASC010  PUSH BX ; SAVE ASCII TABLE ADDR =2CE0 BB605E MOV BX,OFFSET KBSW1TBL ; =2CE3 803FFF ASC040: CMP BYTE PTR[BX],0FFH =2CE6 7418 2D00 JE ASC060 ; IF E =2C75 741E 2C95 JZ SPC060 ; IF SHIFT = OFF = SPC045: =2C77 E85B0F 3BD5 CALL CRTCLR ; CRT ALL CLEAR =2C7A B200 MOV DL,0 =2C7C EB1A 2C98  ; IF SHIFT KEY = OFF = ;---------------*R1.132 '83 2/17 ------------------------------------- =2CA7 3D5F00 CMP AX,5FH ; =2CAA 7427 2CD3 JE ASC025 ; IFRROR SIGNAL =2CE8 380F CMP BYTE PTR[BX],CL =2CEA 7404 2CF0 JE ASC050 ; IF MACTH SIGNAL =2CEC 43 INC BX =2CED 43 INC BX =2CEE EBF3  JMPS SPCRET =2C7E F6065D6140 SPC050: TEST KBSW1,SFTON ; =2C83 7410 2C95 JZ SPC060 ; IF UNSHIFT =2C85 3C98 CMP AL,KBTAB =2C87 7504 2C8D JNE SPC055 ; SHIFT + CTRL + _ =2CAC 3D3200 CMP AX,32H ; =2CAF 7550 2D01 JNE ASCERR ; IF SHIFT + CTRL + ASCII = ERROR =2CB1 B000 MOV AL,00H ; IF SH 2CE3 JMPS ASC040 =2CF0 43 ASC050: INC BX =2CF1 8A0F MOV CL,BYTE PTR[BX] =2CF3 5B POP BX =2CF4 2AED SUB CH,CH =2CF6 03D9  IF NOT TAB KEY =2C89 B01F MOV AL,1FH ; SHIFT+TAB =2C8B EB0B 2C98 JMPS SPCRET =2C8D 3CFC SPC055: CMP AL,KBDEL =2C8F 7504 2C95 JNE SPC060 ; IF NOT DEL KEIFT + CTRL + @ = NULL =2CB3 EB4E 2D03 JMPS ASCRET = ;---------------------------------------------------------------------- = ; CTRL+KEY PROC. =2CB5 3D3000 ASC010: CMP   ADD BX,CX =2CF8 8A07 MOV AL,BYTE PTR[BX] ; GET ASCII CONVERT CODE =2CFA 3C00 CMP AL,0 =2CFC 7505 2D03 JNE ASCRET ; IF NOT NOTHING CODE =2CFE EB01  MOV SS,AX =2D23 BC00FF MOV SP,OFFSET BOOTSTAK =2D26 FF2EF05D JMPF DWORD PTR BOOTOF = ; = ;********************************************* = ; JNE CDCNV2010 ; IF NOT VERTICAL UP = ; MOV AL,0BH = ; JMPS CDCNV2040 = ;CDCNV2010: = ; CMP AL,0F8H =  2D01 JMPS ASCERR = ; =2D00 5B ASC060: POP BX CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 32 =2D01 B200 ASCERR ;* CTRL+KEY PROC. * = ;********************************************* = KBCTRL: =2D2A 2C40 SUB AL,40H ; CTRL+KEY CODE CONVERT =2D2C C3  ; JNE CDCNV2020 ; IF NOT LINE FEED = ; MOV AL,0AH = ; JMPS CDCNV2040 = ;CDCNV2020: = ; CMP AL,0F9H : MOV DL,0 ; ERROR RETURN CODE SET = ; = ASCRET: =2D03 C3 RET = ; = ;*********************************************** RET = ; = ;********************************************* = ;* DATA CODE CONVERTION ROUTINE 2 * = ;* (CURSOR POSITON CONVERT)  = ; JNE CDCNV2030 ; IF NOT FORM FEED = ; MOV AL,0CH = ; JMPS CDCNV2040 = ;CDCNV2030: = ; MOV AL,*********************** = ;* KEY-IN DATA TABLE SERCH ROUTINE * = ;********************************************************************** = KBTBLSRCH: = * = ;********************************************* = CDCNV2: = ; = ; *** Delete next two instructions *** RMG / NECIS *** 9-9-83 = ; = 1DH = ; = ; *** End Deletion *** RMG / NECIS *** 9-9-83 = ; = CDCNV2040: =2D4B C3 RET = ;****************************2D04 803F00 CMP BYTE PTR[BX],00H =2D07 7408 2D11 JE KBTBLERR ; IF DATA END (ERROR) =2D09 3807 CMP BYTE PTR[BX],AL =2D0B 7408 2D15 JE KBTBLNML  ; *** TEST KBSW1,02H ; CHECK CTL-KEY = ; *** JZ CDCNV2009 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 33 =2D2D 803E6F66***************** = ;* CONIN USE AREA * = ;********************************************* = DSEG $ =5DD8 00 KBREPFLG DB 0  ; IF DATA CODE MATCH =2D0D 03D9 ADD BX,CX ; TABLE ADDR UP =2D0F EBF3 2D04 JMPS KBTBLSRCH ; NEXT SEARCH = KBTBLERR: =2D11 B200 00 CMP FLAGX,0 =2D32 7510 2D44 JNE CDCNV2006 =2D34 3CF7 CMP AL,0F7H ; CTL-VERTICAL UP =2D36 7505 2D3D JNE CDCNV2005 =2D38 E8390D 3A74 CALL ROLL ; KBREPEAT FLAG =5DD9 00 KBULFLG DB 0 ; KB UPPER /LOWER FLAG = ; =5DDA 00 CTRLPFLG DB 0 ; CONTROL P STATUS FLAG =5DDB 202020202020 PROFFMSG DB  MOV DL,0 =2D13 EB02 2D17 JMPS KBTBLRET = KBTBLNML: =2D15 B2FF MOV DL,0FFH = KBTBLRET: =2D17 C3 RET = ;*********DOWN =2D3B EB07 2D44 JMPS CDCNV2006 = CDCNV2005: =2D3D 3CF8 CMP AL,0F8H ; CTL-LINE FEED =2D3F 7503 2D44 JNE CDCNV2006 =2D41 E8900C 39D4 CALL  ' ' 2020 =5DE3 0C2020202020 PRONMSG DB 0CH,' ' 2020 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 34 =5DEB 00 SVDATA*********************************** = ;* RETURN BOOT * = ;******************************************** = KBBOOT: =2D18 FA CLI =2D19 B ROLLUP = CDCNV2006: =2D44 E84D0B 3894 CALL CSWRT =2D47 B200 MOV DL,00H =2D49 EB00 2D4B JMPS CDCNV2040 = ; = ; *** Delete f DB 00H ; SAVE CODE =5DEC 09 SPDWK DB 09H ; INPUT OF SCROLL SPEED =5DED 00 SPDSAV DB 00H ; SCROLL SPEED STATUS =5DEE 9001 SPDCNT DW 0190H 000 MOV AL,00H ; DISABLE GRAPHIC DISPLAY =2D1B E672 OUT 72H,AL =2D1D 2BC0 SUB AX,AX =2D1F 8EC0 MOV ES,AX =2D21 8ED0 ollowing section (non-CTRL keys handled directly in SPCCNV now) = ; *** RMG / NECIS *** 9-9-83 = ; = ;CDCNV2009: = ; CMP AL,0F7H =   ; SCROLL SPEED CONSTANT = ; = FF00 BOOTSTAK EQU 0FF00H ; RETURN BOOT STACK =5DF0 ED1F BOOTOF DW 1FEDH ; RETURN BOOT OFFSET =5DF2 00FE BOOTSE DW 0H,39H ; 9 =5E16 8080 DB 80H,80H ; PF 1 =5E18 8181 DB 81H,81H ; PF 2 =5E1A 8282 DB 82H,82H ; PF  DB 0F7H,0BH ; (CURSOR UP) =5E50 F80A DB 0F8H,0AH ; (CURSOR DOWN) =5E52 F90C DB 0F9H,0CH ; --> =5E54 FA1D DB 0FAFE00H ; RETURN BOOT SEGMENT CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 35 = EJECT = ;************************************** 3 =5E1C 8383 DB 83H,83H ; PF 4 =5E1E 8484 DB 84H,84H ; PF 5 =5E20 8585 DB 85H,85H ; PF 6 =5E22 8686 H,1DH ; <-- =5E56 FB1C DB 0FBH,1CH ; INS =5E58 FC18 DB 0FCH,18H ; DEL =5E5A FD0D DB 0FDH,0DH ; ENTER =5E5C FF10 ******************************** = ;* SPECIAL KEY CONVERT TABLE FORMAT * = ;* 1ST BYTE , 2ND BYTE * = ;*  DB 86H,86H ; PF 7 =5E24 8787 DB 87H,87H ; PF 8 =5E26 8888 DB 88H,88H ; PF 9 =5E28 8989 DB 89H,89H  DB 0FFH,10H ; PRINT =5E5E 0000 DB 0,0 ; DATA END (STOPER) = ; = ;*********************************************************** ORIGINAL CONVERT * = ;* CODE , CODE * = ;***************************************************************** ; PF 10 =5E2A 8A8A DB 8AH,8AH ; PF 11 =5E2C 8B8B DB 8BH,8BH ; PF 12 =5E2E 8C8C DB 8CH,8CH ; PF 13 =5E30 8D8D *********** = ;* KB SIGNAL TABLE FORMAT * = ;********************************************************************** = 5E60 KBSW1TBL EQU O***** = 5DF4 SPCTBL EQU OFFSET $ =5DF4 1B1B DB 1BH,1BH ; ESC =5DF6 2020 DB 20H,20H ; (SP) =5DF8 6A2A DB 6AH,2AH  DB 8DH,8DH ; PF 14 =5E32 8E8E DB 8EH,8EH ; PF 15 =5E34 8F8F DB 8FH,8FH ; PF 16 =5E36 9000 DB 90H,0FFSET $ =5E60 0001 DB 0,1 ; NORMAL =5E62 4002 DB 40H,2 ; NORMAL (SHIFT) =5E64 0403 DB 04H,3 ; GRPH1 (UNSHIFT) =5E66 4 ; * =5DFA 6B2B DB 6BH,2BH ; + =5DFC 6D2D DB 6DH,2DH ; - =5DFE 6E2E DB 6EH,2EH ; . =5E00 6F2F DB  ; PF 17 =5E38 9100 DB 91H,0 ; PF 18 =5E3A 9200 DB 92H,0 ; PF 19 =5E3C 9300 DB 93H,0 ; PF 20 =404 DB 44H,4 ; GRPH1 (SHIFT) =5E68 0805 DB 08H,5 ; GRPH2 (UNSHIFT) =5E6A 4806 DB 48H,6 ; GRPH2 (SHIFT) =5E6C 2001  6FH,2FH ; / =5E02 7030 DB 70H,30H ; TEN-YEY 0 =5E04 7131 DB 71H,31H ; 1 =5E06 7232 DB 72H,32H ; 5E3E 9400 DB 94H,0 ; PF 21 =5E40 9500 DB 95H,0 ; PF 22 =5E42 9613 DB 96H,13H ; BREAK-STOP =5E44 970D  DB 20H,1 ; ALT (UNSHIFT) =5E6E 6002 DB 60H,2 ; ALT (SHIFT) =5E70 2403 DB 24H,3 ; ALT+GRPH1 (UNSHIFT) =5E72 6404  2 =5E08 7333 DB 73H,33H ; 3 =5E0A 7434 DB 74H,34H ; 4 =5E0C 7535 DB 75H,35H ; 5 =5E0E 7636  DB 97H,0DH ; RETURN =5E46 9809 DB 98H,09H ; TAB =5E48 9A1E DB 9AH,1EH ; CLEAR-HOME =5E4A 9C08 DB 9CH,08H  DB 64H,4 ; ALT+GRPH1 (SHIFT) =5E74 2805 DB 28H,5 ; ALT+GRPH2 (UNSHIFT) =5E76 6806 DB 68H,6 ; ALT+GRPH2 (SHIFT) =5E78 FF00  DB 76H,36H ; 6 =5E10 7737 DB 77H,37H ; 7 =5E12 7838 DB 78H,38H ; 8 =5E14 7939 DB 79 ; BACK-SPACE CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 36 =5E4C 9E3F DB 9EH,3FH ; HELP *R1.132 '83 2/17 =5E4E F70B    DB 0FFH,0 ; END (ERROR) = ; = ;********************************************************************** = ;* ASCII KEY CODE CONVERT TABLE FORMAT  DB 39H,39H,28H,09H,98H,0D6H,0ADH,28H ; ( 9 AD28 =5EC2 3030290A99DC DB 30H,30H,29H,0AH,99H,0DCH,0AEH,29H ; ) 0 AE29 =5ECA 5F2D5F0B9AA8 DB 5FH,2DH,5FH,0BH,9AH,0A8H,0CEH,5FB 44H,64H,44H,1DH,0EDH,0C1H,00H,44H ; D 0044 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 38 =5F6A 4666461EEEC4 DB 46H,66H,46H,1EH,0EE * = ;* BYTE ; * = ;* 0 ; ORIGINAL CODE * = ;* 1 H ; _ - CE5F =5ED2 2D3D2B0C9BAF DB 2DH,3DH,2BH,0CH,9BH,0AFH,0ACH,2BH ; + = AC2B =5EDA 40607E0D9CB0 DB 40H,60H,7EH,0DH,9CH,0B0H,0C8H,7EH ; ~ ` C87E = H,0C4H,00H,46H ; F 0046 =5F72 4767471FEFBC DB 47H,67H,47H,1FH,0EFH,0BCH,00H,47H ; G 0047 =5F7A 48684880F0CA DB 48H,68H,48H,80H,0F0H,0CAH,00H,48H ; H 004 ; NORMAL (UNSHIFT) / ALT (UNSHIFT) * = ;* 2 ; " (SHIFT) / ALT (SHIFT) *R1.107 * = ;* 3 ; GRPH1 (UNSHIFT) / ALT+GRPH1 (UNSHIFT) * =  ; =5EE2 5171510E9DC0 DB 51H,71H,51H,0EH,9DH,0C0H,00H,51H ; Q 0051 =5EEA 5777570F9EC3 DB 57H,77H,57H,0FH,9EH,0C3H,00H,57H ; W 0057 =5EF2 456545109FB2 8 =5F82 4A6A4A81F1B7 DB 4AH,6AH,4AH,81H,0F1H,0B7H,00H,4AH ; J 004A =5F8A 4B6B4B82F2B8 DB 4BH,6BH,4BH,82H,0F2H,0B8H,00H,4BH ; K 004B =5F92 4C6C4C83F3CF DB 4 ;* 4 ; " (SHIFT) / " (SHIFT) * = ;* 5 ; GRPH2 (UNSHIFT) / ALT+GRPH2 (UNSHIFT) * = ;* 6 ; " (SHIFT) /  DB 45H,65H,45H,10H,9FH,0B2H,00H,45H ; E 0045 =5EFA 52725211E0BD DB 52H,72H,52H,11H,0E0H,0BDH,00H,52H ; R 0052 =5F02 54745412E1B6 DB 54H,74H,54H,12H,0E1H,0B6H,00CH,6CH,4CH,83H,0F3H,0CFH,0,4CH ; L 004C =5F9A 3A3B3A84F4C9 DB 3AH,3BH,3AH,84H,0F4H,0C9H,00H,3AH ; : ; 003A =5FA2 3B272285F500 DB 3BH,27H,22H,85H,0F5H,0,0D2H,22H  " (SHIFT) * = ;* 7 ; UNUSED *R1.107 '83 4/27 * = ;********************************************************************** = 5E7A ASCTBL EQU H,54H ; T 0054 =5F0A 59795913E2DD DB 59H,79H,59H,13H,0E2H,0DDH,00H,59H ; Y 0059 =5F12 55755514E3C5 DB 55H,75H,55H,14H,0E3H,0C5H,00H,55H ; U 0055 =5F1A  ; " ' D222 = ; =5FAA 5A7A5A86F6D8 DB 5AH,7AH,5AH,86H,0F6H,0D8H,00H,5AH ; Z 005A =5FB2 58785887F7DA DB 58H,78H,58H,87H,0F7H,0DAH,00H,58H ; X  OFFSET $ =5E7A 3131210190C7 DB 31H,31H,21H,01H,90H,0C7H,0A0H,21H ; ! 1 A021 =5E82 3232400291CC DB 32H,32H,40H,02H,91H,0CCH,0A2H,40H ; @ 2 A240 =5E8A 3333230392B1 49694915E4C6 DB 49H,69H,49H,15H,0E4H,0C6H,00H,49H ; I 0049 =5F22 4F6F4F16E5D7 DB 4FH,6FH,4FH,16H,0E5H,0D7H,00H,4FH ; O 004F =5F2A 50705017E6BE DB 50H,70H,500058 =5FBA 43634388F8B9 DB 43H,63H,43H,88H,0F8H,0B9H,00H,43H ; C 0043 =5FC2 56765689F9D1 DB 56H,76H,56H,89H,0F9H,0D1H,00H,56H ; V 0056 =5FCA 4262428AFABB DB  DB 33H,33H,23H,03H,92H,0B1H,0A6H,23H ; # 3 A623 =5E92 3434240493B3 DB 34H,34H,24H,04H,93H,0B3H,0DBH,24H ; $ 4 DB24 =5E9A 3535250594B4 DB 35H,35H,25H,05H,94H,0B4H,0D3H,H,17H,0E6H,0BEH,00H,50H ; P 0050 =5F32 5B5B7B18E700 DB 5BH,5BH,7BH,18H,0E7H,00H,0A7H,7BH ; [ A77B =5F3A 5D5D7D19E800 DB 5DH,5DH,7DH,19H,0E8H,00H,0A9H,7DH ; ] 42H,62H,42H,8AH,0FAH,0BBH,00H,42H ; B 0042 =5FD2 4E6E4E8BFBC2 DB 4EH,6EH,4EH,8BH,0FBH,0C2H,00H,4EH ; N 004E =5FDA 4D6D4D8CFCCB DB 4DH,6DH,4DH,8CH,0FCH,0CBH,00H,4DH 25H ; % 5 D325 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 37 =5EA2 3636D00695B5 DB 36H,36H,0D0H,06H,95H,0B5H,0CDH,9BH ; 6  A97D =5F42 5C5C7C1AE900 DB 5CH,5CH,7CH,1AH,0E9H,00H,0AAH,7CH ; AA7C =5F4A 5ECE5E00EA00 DB 5EH,0CEH,5EH,00H,0EAH,00H,0ABH,5EH ; ^ AB5E =  ; M 004D =5FE2 2C2C3C8DFDBF DB 2CH,2CH,3CH,8DH,0FDH,0BFH,0A4H,3CH ; < , A43C =5FEA 2E2E3E8EFEBA DB 2EH,2EH,3EH,8EH,0FEH,0BAH,0A1H,3EH ; > . A13E =5FF2 2F2F3F8FFF00 CD9B =5EAA 3737260796D4 DB 37H,37H,26H,07H,96H,0D4H,0A5H,26H ; & 7 A526 =5EB2 38382A0897D5 DB 38H,38H,2AH,08H,97H,0D5H,0A3H,2AH ; * 8 A32A =5EBA 3939280998D6  ; =5F52 4161411BEBDE DB 41H,61H,41H,1BH,0EBH,0DEH,00H,41H ; A 0041 =5F5A 5373531CECDF DB 53H,73H,53H,1CH,0ECH,0DFH,0,53H ; S 0053 =5F62 4464441DEDC1 D   DB 2FH,2FH,3FH,8FH,0FFH,0,0D9H,3FH ; ? / D93F = ; CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 39 =  ; =2D61 E44E IN AL,KBSFP =2D63 A801 TEST AL,01H =2D65 7405 2D6C JZ INTKB003 ; IF NOT SHIFT =2D67 800E5C6140 OR KBSW0,40H ; SD 2DB2 JMPS INTKB0048 ; = GRAPH MEMORY DUMP = INTKB0044: =2DA5 B100 MOV CL,00H ; CTRL + PRINT KEY =2DA7 EB09 2DB2 JMPS INTKB0048  EJECT = ;********************************************************************** = ;* KEY BOARD INTERRUPT ROUTINE * = ;**************HIFT = INTKB003: =2D6C A804 TEST AL,04H =2D6E 7405 2D75 JZ INTKB004 ; IF NOT CAPS =2D70 800E5C6180 OR KBSW0,80H ; CAPS LOCK = ; = CHARACTER DUMP = INTKB0046: =2DA9 F6065C6101 TEST KBSW0,FNCON ; CTRL KEY OFF , FNC KEY ON ? =2DAE 7407 2DB7 JZ INTKB005 ; NOT SCREEN DUMP MOD******************************************************** = CSEG $ = INTKB: =2D4C E84B04 319A CALL REGSAVE = ; = ; GET DATA FROM K INTKB004: =2D75 E448 IN AL,KBINP ; GET KEY-IN DATA =2D77 A25861 MOV KBIND,AL = =2D7A 3C96 CMP AL,BSTOP ; =2D7C 7511 E =2DB0 B101 MOV CL,01H ; FNC + PRINT KEY = ; = CRT GRAPH DUMP = INTKB0048: =2DB2 E88400 2E39 CALL SCRDB & SET IT TO FIFO BUFFER = ; = INTKB000: =2D4F E44A IN AL,KBSTP ; READ STATUS =2D51 A801 TEST AL,01H =2D53 7405 2D5A JZ INTKB00  2D8F JNE INTKB0042 ; IF NOT BREAK-STOP KEY R1.133 '83 3/10 =2D7E F6065C6101 TEST KBSW0,FNCON ; CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 UMP ; INTERRUPT SCREEN DUMP =2DB5 EB6A 2E21 JMPS INTKB05 ; = ;-------------------------------------------------------------------------- = = INTKB005: =2DB7 =2D55 E448 IN AL,KBINP ; DUMMY GET =2D57 E9C700 2E21 JMP INTKB05 = INTKB00: = ;------------------------- R1.131 '82 12/24 ------------------------ = PAGE 40 =2D83 7432 2DB7 JZ INTKB005 ; IF NOT FNC ON =2D85 F6065C6102 TEST KBSW0,CTLON ; =2D8A 742B 2DB7 JZ INTKB005 ; IF NOT CTRL ON =  803E606100 CMP SYSKEYINFLG,0 ; DISABLE EXTERNAL INTERRUPT ??? =2DBC 7402 2DC0 JE INTKB006 ; IF ENABLE KEY BOARD INPUT =2DBE EB61 2E21 JMPS INTKB05 ; IF D ; = ; GENERATE CONTROL DATA = ; BIT = ; KBSW0 = 0 ; FNC = ; 1 ; CN ; = ; RETURN BOOT = ; =2D8C E889FF 2D18 CALL KBBOOT ; RETURN BOOT = = ;-------------- R1.133 '83 3/10 ----------------------ISABLE KEY BOARD INPUT = INTKB006: = ;---------------*R1.107 4/13/'83 ------------------------------------ =2DC0 F6065C6120 TEST KBSW0,20H =2DC5 740E 2DD5 JZ INTKB007 TRL = ; 2 ; GRPH 1 = ; 3 ; GRPH 2 = ; 4 ; NOT USED = ; 5 --------------------- = ; = ; CHECK SCREEN DUMP PROC. = ; = INTKB0042: =2D8F 3CFF CMP AL,KBPRNT ; PRINT KEY ? =2D91 7 ; IF NOT ALT KEY ON =2DC7 2E800E862504 OR ALTRBYTFLG,04H =2DCD 2EC606783989 MOV ALTRBYT,89H =2DD3 EB14 2DE9 JMPS INTKB008 = INTKB007: =2DD5 2E802686258B  ; ALT = ; 6 ; SHIFT = ; 7 ; CAPS LOCK = ; = ; (1) CHECK SW SIGNAL = ; =2D524 2DB7 JNE INTKB005 ; NON =2D93 F6065C6102 TEST KBSW0,CTLON ; CTRL KEY ON ? =2D98 740F 2DA9 JZ INTKB0046 ; OFF =2D9A F6065C6101  AND ALTRBYTFLG,8BH =2DDB 2EF606862503 TEST ALTRBYTFLG,03H =2DE1 7506 2DE9 JNZ INTKB008 =2DE3 2EC606783900 MOV ALTRBYT,0 = INTKB008: = CP/M ASM86 1.1 SOURCE: USCBIOS5A E44C IN AL,KBSWP =2D5C 242F AND AL,2FH ; MASK NOT USED FLAG =2D5E A25C61 MOV KBSW0,AL = ; (2) CHECK SHIFT STATUS =  TEST KBSW0,FNCON ; CTRL KEY ON , FNC KEY ON ? =2D9F 7404 2DA5 JZ INTKB0044 ; OFF =2DA1 B102 MOV CL,02H ; CTRL + FNC + PRINT KEY =2DA3 EB0  .A86 Customized Basic I/O System V1 PAGE 41 = ;-------------------------------------------------------------------- = ; = ; CHECK FIFOAG CLEAR = ;---------------------------------------------------------------------- = ; = ; RESTORE REGISTER = ; = ;-------------- R1.1 POP DS ; =2E52 C606856000 MOV GDCBUSYF,0 = ; =2E57 8A16DC64 MOV DL,CA ; =2E5B 8A36DB64 MOV DH,LA =2E5F E8940C 3AF6 CALL KBL FULL = ; =2DE9 B100 MOV CL,0 =2DEB 803E16613E CMP KBIN,KBFIFOSZ-2 =2DF0 7407 2DF9 JE INTKB01 =2DF2 8A0E1661 MOV CL,KBIN =2DF6 80C102 33 3/10 DELETE ----------------------------------- =2E30 C606FD5F01 MOV INTKBFLG,1 ; IF KB INPUT SET ON = INTKB06: ; R1.133 3/10 =2E35 E8AB03 31E3 CALL CCV ; =2E62 E8E90C 3B4E CALL KBCSRO ; OUTPUT CURSOR AT CURRENT SCREEN ADR. = SCRDMPRET: =2E65 C3 RET = ;---------------------------------------------- ADD CL,2 = INTKB01: =2DF9 3A0E1761 CMP CL,KBOUT ; FIFO FULL : = ; (KBIN+2) MOD 64 = KBOUT ? = ;  REGRESTORE = ; =2E38 CF IRET ; RETURN = ; = ;-------------- R1.133 '83 3/11 --------------------------------------- = ------------------------- CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 43 = EJECT = ;***************************************** NEED BELL ALARM =2DFD 7422 2E21 JE INTKB05 ; YES =2DFF 803E5F6100 CMP CLICKFLG,0 =2E04 7403 2E09 JE INTKB04 ; KEY CLICK OFF =2E06 E86504 326E  ;************************************************************************ CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 42 = ;* SCREEN DUMP ***************************** = ;* INTTM TIMER INTERRUPT ROUTINE * = ;********************************************************************** = INTTM:  CALL KBCLICK ; YEY CLICK = ; = ; SET CONTROL AND INPUT DATA TO FIFO BUFFER = ; = INTKB04: =2E09 BB1861 MOV BX,OFFSET KB * = ;* CL = 00H ; CHARACTER DUMP ( CTRL + PRINT) * = ;* = 01H ; CRT GRAPH DUMP ( FNC + PRINT) * =  =2E66 E89B03 3204 CALL REGSAVETM = ; RELOAD 25MS COUNTER =2E69 B004 MOV AL,04H =2E6B E646 OUT 46H,AL ; RESET TIMER INTERRUPT =2E6D 2AC0 FIFO =2E0C A01661 MOV AL,KBIN =2E0F 98 CBW =2E10 03D8 ADD BX,AX =2E12 A05C61 MOV AL,KBSW0 =2E15 8807 MOV BYTE PTR [BX],AL ; C ;* = 02H ; GRAPH MEMORY DUMP ( CTRL + FNC + PRINT) * = ;************************************************************************ = ; = 00DD INTSDP EQU 2 SUB AL,AL =2E6F E629 OUT 29H,AL =2E71 B0F0 MOV AL,0F0H ; 25MS =2E73 E629 OUT 29H,AL =2E75 FE06FA5F INC INTTMEVEN =2E79 F606FA5F01 ONTROL DATA =2E17 43 INC BX =2E18 A05861 MOV AL,KBIND =2E1B 8807 MOV BYTE PTR [BX],AL = ; = ; MAINTENANCE KBIN POINTER = 21 ; INTERRUPTION SCREEN DUMP = ; = SCRDUMP: =2E39 803E856000 CMP GDCBUSYF,0 ; IF GDC BUSY =2E3E 7525 2E65 JNZ SCRDMPRET ; BUSY =2E40 803E6E6600  TEST INTTMEVEN,01H =2E7E 7403 2E83 JZ INTTM00 =2E80 E9BE00 2F41 JMP INTTMRET = INTTM00: = ; CHECK FIFO EMPTY & KB REPEAT ON =2E83 A01661 MO ; =2E1D 880E1661 MOV KBIN,CL = ;------------------ R1.131 '82 12/24 ---------------------------------- = INTKB05: ; R1.133 3/10 =2E21 C606 CMP DMAXFLG,0 ; IF DMAXER EXECUTE =2E45 751E 2E65 JNZ SCRDMPRET ; EXECUTE = ; =2E47 C606856001 MOV GDCBUSYF,1 =2E4C 1E PUSH DS V AL,KBIN =2E86 3A061761 CMP AL,KBOUT =2E8A 753D 2EC9 JNE INTTM03 ; IF KB FIFO IS NOT EMPTY =2E8C E44C IN AL,KBSWP =2E8E A810 TEST AL,10H =2E90 7437826000 MOV KBREPDELAY,0 ; KB REPEAT DELAY TIME CLEAR =2E26 C606836000 MOV KBREPRATE,0 ; KB REPEAT RATE TIME CLEAR =2E2B C606D85D00 MOV KBREPFLG,0 ; KB REPEAT FL ; =2E4D 06 PUSH ES ; = ; =2E4E CDDD INT INTSDP = ; =2E50 07 POP ES ; =2E51 1F    2EC9 JZ INTTM03 ; IF REPEAT SIGNAL OFF = ; =2E92 803E826000 CMP KBREPDELAY,0 =2E97 7522 2EBB JNE INTTM02 = INTTM01: =2E99 803E836000  DEC KBMODECHK =2EFB 803E816000 CMP SYSTMCHK,0 =2F00 7406 2F08 JZ INTTM042 =2F02 FE0E8160 DEC SYSTMCHK ; COUNT DOWN =2F06 EB28 2F30 JMPS INTTM05 = L,KBSFP =2F58 A804 TEST AL,04H =2F5A 7504 2F60 JNZ KBSTCHK01 =2F5C FE060060 INC KBSFSAV = KBSTCHK01: =2F60 A00060 MOV AL,KBSFSAV =2F63 32060 CMP KBREPRATE,0 =2E9E 7508 2EA8 JNE INTTM011 =2EA0 A07E60 MOV AL,REPDELAY =2EA3 A28260 MOV KBREPDELAY,AL = ; SET 1 SEC INTTM042: =2F08 A07D60 MOV AL,TMCHK =2F0B A28160 MOV SYSTMCHK,AL =2F0E E8BE01 30CF CALL GETTIME ; GET TIME =2F11 A01360 MOV AL,SYSMIN =2F14160 XOR AL,KBSFSAV1 =2F67 741C 2F85 JZ KBSTCHK03 =2F69 FE06FC5F INC DISPREQKB =2F6D A00060 MOV AL,KBSFSAV =2F70 A20160 MOV KBSFSAV1,AL =  DELAY COUNTER =2EA6 EB30 2ED8 JMPS INTTM04 = INTTM011: =2EA8 FE0E8360 DEC KBREPRATE ; COUNT DOWN KB REPEAT RATE COUNTER =2EAC 752A 2ED8 JNZ INTTM04 =2EAE C606D85D 803E116002 CMP SYSTMFLG,2 ; IF CLOCK REWRITED =2F19 7406 2F21 JE INTTM045 =2F1B 3A061760 CMP AL,OLDMIN =2F1F 740F 2F30 JE INTTM05 = ; CONVERT KBSTCHK02: =2F73 BB0260 MOV BX,KBSTBUF ; SET SCREEN MEMORY ADDRESS =2F76 803E006000 CMP KBSFSAV,0 =2F7B 7405 2F82 JE KBSTCHK021 =2F7D E88600 3006 CALL 01 MOV KBREPFLG,1 =2EB3 A07F60 MOV AL,REPRATE =2EB6 A28360 MOV KBREPRATE,AL =2EB9 EB1D 2ED8 JMPS INTTM04 = INTTM02: =  TIME DATA & SET IT TO DISPLAY BUFFER = INTTM045: =2F21 C606116000 MOV SYSTMFLG,0 ; SYSTM FLAG RESET =2F26 A21760 MOV OLDMIN,AL =2F29 E8FB01 3127 CALL TIMESET =2F2C  KBATTOFF ; IF CAPS IS LOCKED =2F80 EB03 2F85 JMPS KBSTCHK03 = KBSTCHK021: =2F82 E87D00 3002 CALL KBATTON ; IF CAPS IS NOT LOCKED = KBSTCHK03: =2F85 E44C  ; COUNT DOWN KB REPEAT-DELAY COUNTER =2EBB FE0E8260 DEC KBREPDELAY =2EBF 7517 2ED8 JNZ INTTM04 =2EC1 A07F60 MOV AL,REPRATE =2EC4 A28360 MOV FE06FB5F INC DISPREQ = ; = INTTM05: =2F30 803EFB5F00 CMP DISPREQ,0 =2F35 7507 2F3E JNE INTTM051 =2F37 803EFC5F00 CMP DISPREQKB,0 IN AL,KBSWP ; GET KB STATUS =2F87 242C AND AL,2CH =2F89 A2FE5F MOV KBSWSAV,AL =2F8C 3206FF5F XOR AL,KBSWSAV1 =2F90 745A 2FEC JZ KBS KBREPRATE,AL =2EC7 EB0F 2ED8 JMPS INTTM04 = INTTM03: =2EC9 C606816000 MOV SYSTMCHK,0 =2ECE C606826000 MOV KBREPDELAY,0 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized B =2F3C 7403 2F41 JE INTTMRET = INTTM051: =2F3E E8D100 3012 CALL DISPSTATUS = INTTMRET: =2F41 E80903 324D CALL REGRESTORETM =2F44 CF TCHK06 =2F92 FE06FC5F INC DISPREQKB =2F96 A0FE5F MOV AL,KBSWSAV =2F99 A2FF5F MOV KBSWSAV1,AL =2F9C BB0660 MOV BX,KBSTBUF+4 ; SET SCREEN MEMORY ADDRESS =2F9F Fasic I/O System V1 PAGE 44 =2ED3 C606836000 MOV KBREPRATE,0 = INTTM04: =2ED8 A06161 MOV AL,SYSDSPFLG =2EDB 32066261 XOR AL IRET = ; = ;********************************************************************** = ;* KB STATUS CHECK ROUTINE * = ;606FE5F20 TEST KBSWSAV,20H ; ALT MODE CHECK =2FA4 7411 2FB7 JZ KBSTCHK031 =2FA6 2E800E862504 OR ALTRBYTFLG,04H ; SET ALT_KEY BIT *R1.107 '83 04/13 =2FAC 2EC606783989 MOV ,SYSDSPFSAV =2EDF 7404 2EE5 JZ INTTM040 =2EE1 FE06FB5F INC DISPREQ = INTTM040: =2EE5 803E846000 CMP KBMODECHK,0 =2EEA 750B 2EF7 JNZ INTTM041 =2EEC ********************************************************************** = KBSTCHK: =2F45 803EFD5F00 CMP INTKBFLG,0 ; IF KEY IN =2F4A 7439 2F85 JE KBSTCHK03 CP/M ASM86 1.1 SOURCE: USCBI ALTRBYT,89H =2FB2 E84D00 3002 CALL KBATTON ; IF ALT MODE =2FB5 EB17 2FCE JMPS KBSTCHK04 = KBSTCHK031: =2FB7 2E802686250B AND ALTRBYTFLG,0BH ; RESET ALT_KEY BIT *RE85600 2F45 CALL KBSTCHK =2EEF A08060 MOV AL,MODECHK =2EF2 A28460 MOV KBMODECHK,AL =2EF5 EB11 2F08 JMPS INTTM042 = INTTM041: =2EF7 FE0E8460 OS.A86 Customized Basic I/O System V1 PAGE 45 =2F4C C606FD5F00 MOV INTKBFLG,0 ; FLAG RESET =2F51 C606006000 MOV KBSFSAV,0 =2F56 E44E IN A  1.107 '83 04/15 =2FBD 2EF606862503 TEST ALTRBYTFLG,03H ; *R1.107 '83 04/15 =2FC3 7506 2FCB JNZ KBSTCHK032 ; *R1.107 '83 04/15 =2FC5 2EC606783900 MOV ADATA =300D 43 INC BX =300E E2FB 300B LOOP KBATSET1 =3010 43 INC BX =3011 C3 RET = ;**************************************************PREQ,0 =305E 7436 3096 JE DISPSTATUS04 =3060 C606FB5F00 MOV DISPREQ,0 ; CLEAR DISPLAY REQUEST FLAG =3065 B80000 MOV AX,0 ; CURSOR POSITION SET TO HOME LINE =3068 E8E30A LTRBYT,0 ; *R1.107 '83 04/15 = KBSTCHK032: =2FCB E83800 3006 CALL KBATTOFF ; IF NOT ALT MODE = KBSTCHK04: =2FCE F606FE5F04 TEST KBSWSAV,04******************** = ;* DISPSTATUS DISPLAY SYSTEM STATUS LINE * = ;********************************************************************** = DISPSTATUS: =30 3B4E CALL KBCSRO =306B B95000 MOV CX,COLUMN =306E 803E616100 CMP SYSDSPFLG,0 =3073 740B 3080 JE DISPSTATUS02 =3075 49 DEC CX =3076 E8AE0B 3C2H ; GRPH1 MODE CHECK =2FD3 7405 2FDA JZ KBSTCHK041 =2FD5 E82A00 3002 CALL KBATTON ; IF GRPH1 MODE =2FD8 EB03 2FDD JMPS KBSTCHK05 = KBSTCHK041: =2FDA E82900 12 803E856000 CMP GDCBUSYF,0 ; =3017 7403 301C JE DISPSTATUS000 ; IF GDC READY =3019 E9B200 30CE JMP DISPSTATUSRET ; IF GDC BUSY = DISPSTATUS000: =301C 803E6E6600 7 CALL KBCRTC0 ; ERASE STATUS LINE =3079 C606FE5FFF MOV KBSWSAV,0FFH =307E EB42 30C2 JMPS DISPSTATUS06 = DISPSTATUS02: =3080 BB1860 MOV BX,OFFSET STAT 3006 CALL KBATTOFF ; IF NOT GRPH1 MODE = KBSTCHK05: CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 46 =2FDD F606FE5F08 TEST CMP DMAXFLG,0 ; DMA EXECUTE FLAG =3021 7403 3026 JE DISPSTATUS00 ; IF NOT DMA EXECUTE =3023 E9A800 30CE JMP DISPSTATUSRET = DISPSTATUS00: =3026 803E626100 USLINE = DISPSTATUS03: =3083 8A07 MOV AL,[BX] = ; DISPLAY STATUS LINE =3085 2EA29130 MOV STDTBYT,AL =3089 E8070B 3B93 CALL KBMOUT =308C 03  KBSWSAV,08H ; GRPH2 MODE CHECK =2FE2 7405 2FE9 JZ KBSTCHK051 =2FE4 E81B00 3002 CALL KBATTON ; IF GRPH2 MODE =2FE7 EB03 2FEC JMPS KBSTCHK06 = KBSTCHK051: =2F CMP SYSDSPFSAV,0 =302B 7415 3042 JE DISPSTATUS002 =302D 803E616100 CMP SYSDSPFLG,0 =3032 7403 3037 JE DISPSTATUS001 ; SYSDSPFLG 1 -> 1 =3034 E99700 30CE JMP DI DB 03H =308D 2042 DW 4220H =308F 00 STALTBYT DB 00H =3090 40 DB 40H =3091 00 STDTBYT DB 00H =3092 40 DB 4E9 E81A00 3006 CALL KBATTOFF ; IF NOT GRPH2 MODE = KBSTCHK06: =2FEC A0EC5D MOV AL,SPDWK =2FEF 3A06ED5D CMP AL,SPDSAV =2FF3 740C 3001 JE KBSTCSPSTATUSRET = DISPSTATUS001: =3037 C606626100 MOV SYSDSPFSAV,0 ; 1 -> 0 =303C FE06FC5F INC DISPREQKB =3040 EB0B 304D JMPS DISPSTATUS01 = 0H =3093 43 INC BX =3094 E2ED 3083 LOOP DISPSTATUS03 = DISPSTATUS04: =3096 803EFC5F00 CMP DISPREQKB,0 =309B 7425 30C2 JE DISPSTATUS06 =309D C6HKRET =2FF5 A2ED5D MOV SPDSAV,AL =2FF8 0C30 OR AL,30H =2FFA A24D60 MOV STATUSSP,AL =2FFD FE06FB5F INC DISPREQ = KBSTCHKRET: =3001 C3  DISPSTATUS002: CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 47 =3042 803E616100 CMP SYSDSPFLG,0 =3047 7404 304D JE DISPSTATUS01 ; SY06FC5F00 MOV DISPREQKB,0 =30A2 B90F00 MOV CX,KBSTBUFSZ =30A5 BB0260 MOV BX,KBSTBUF =30A8 B81F10 MOV AX,STATUSKB_AD ; SCREEN ADDRESS FOR KB STATUS =30AB E8A RET = ; = KBATTON: =3002 B090 MOV AL,90H ; ATTRIBUTE DEFAULT =3004 EB02 3008 JMPS KBATSET = KBATTOFF: =3006 B0SDSPFLG 0 -> 0 =3049 FE066261 INC SYSDSPFSAV ; 0 -> 1 = DISPSTATUS01: =304D 2EFF36CE3B PUSH CRTDSP ; SAVE CURSOR DISP PARAM --*R1.133 '83 03/10-- =3052 E8CD07 00A 3B4E CALL KBCSRO = DISPSTATUS05: =30AE 8A17 MOV DL,[BX] =30B0 2E8816BB30 MOV KBATBYT,DL =30B5 E8DB0A 3B93 CALL KBMOUT =30B8 03 80 MOV AL,80H ; ATTRIBUTE REVERSE = KBATSET: =3008 B90300 MOV CX,3 = KBATSET1: =300B 8807 MOV [BX],AL ; SET ATTRIBUTE  3822 CALL CURSOROFF ; DISABLE CURSOR DISPLAY =3055 E8FC0B 3C54 CALL KBCSAD ; CURRENT CURSOR ADR. --*R1.133 '83 03/18-- =3058 50 PUSH AX =3059 803EFB5F00 CMP DIS   DB 03H =30B9 2042 DW 4220H =30BB 00 KBATBYT DB 00H =30BC 40 DB 40H =30BD 00 DB 00H CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/DATA (STORED) =30F1 58 POP AX =30F2 B10F MOV CL,15 ; CL = COUNTER (CNT1) =30F4 E90200 30F9 JMP GETTM021 = GETTM02: =30F7 B110 MO GETTMRET: =3126 C3 RET ; RETURN = ; = ;********************************************************************** = ;* TIMESET CONVEO System V1 PAGE 48 =30BE 40 DB 40H =30BF 43 INC BX =30C0 E2EC 30AE LOOP DISPSTATUS05 = DISPSTATUS06: = V CL,16 ; CL = COUNTER (CNT1) = GETTM021: =30F9 0C10 OR AL,10H =30FB EE OUT DX,AL ; CLK = 1 =30FC 56 PUSH SI ; WAIRT TIME DATA TO ASCII * = ;********************************************************************** = TIMESET: =3127 1E PUSH DS =3128 B800A0  ;***** =30C2 58 POP AX = ;***** =30C3 E8880A 3B4E CALL KBCSRO =30C6 2E8F06CE3B POP CRTDSP ; RESTORE CURSOR DISP PARAMETER --*R1.133 '83 03/10-T = 5 (MICRO SEC.) =30FD 5E POP SI =30FE 56 PUSH SI =30FF 5E POP SI =3100 50 PUSH AX =3101 EC IN AL,DX ; REMOV AX,0A000H ; =312B 8ED8 MOV DS,AX ; DS = C_MOS SEGMENT =312D BB0001 MOV BX,0100H ; BX = YY ADDRESS =3130 8B07 MOV AX,[BX] ; GET YY FROM C_MOS - =30CB E8E90A 3BB7 CALL KBCSRD ; OUTPUT CURSOR DISP COMMAND = DISPSTATUSRET: =30CE C3 RET = ; = ;**************************************AD DATA (1BIT) =3102 D0E8 SHR AL,1 ; AL = READ DATA (1BIT) =3104 D1DD RCR BP,1 ; BP = READ DATA (STORED) =3106 58 POP AX =3107 24EF  =3132 1F POP DS =3133 A36060 MOV STATUSYY,AX ; SET YY STATUS LINE BUFFER =3136 A01660 MOV AL,SYSMM =3139 E84F00 318B CALL GETNIBBLE =313C 50 ******************************** = ;* GET TIME ROUTINE * = ;********************************************************************** = GETTAND AL,0EFH ; =3109 EE OUT DX,AL ; CLK = 0 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 49 =310A 56 PUSH  PUSH AX =313D B430 MOV AH,30H ; CONVERT HEX TO ASCII =313F 3C0A CMP AL,10 =3141 7204 3147 JB TIMESET01 =3143 2C0A SUB AL,10 =3145 B431 IME: =30CF 803E116001 CMP SYSTMFLG,01 ; =30D4 7450 3126 JE GETTMRET ; WRITING CLOCK NOW = GETTM01: =30D6 55 PUSH BP =30D7 BB1260 MOV  SI ; WAIT = 5 (MICRO SEC.) =310B 5E POP SI =310C 56 PUSH SI =310D 5E POP SI =310E 90 NOP =310F E2E8 30F9 LOOP GETT MOV AH,31H = TIMESET01: =3147 0C30 OR AL,30H =3149 86E0 XCHG AH,AL =314B A35A60 MOV STATUSMM,AX =314E 58 POP  BX,OFFSET SYSTM ; BX = SYSTM BUFFER ADDRESS =30DA F9 STC =30DB BE0200 MOV SI,2 ; SI = COUNTER (CNT0) =30DE BA5800 MOV DX,0058H ; DX = I/O PORT# =30E1 B003 M021 ; JUMP IF CNT1 NE 0 =3111 4E DEC SI ; DEC. SI =3112 780D 3121 JS GETTM022 ; SET READ DATA =3114 892F MOV [BX],BP ; =3116 43  AX = ; GET DAY OF WEEK =314F 8AC4 MOV AL,AH =3151 250F00 AND AX,0FH =3154 B90300 MOV CX,3 =3157 F7E1 MUL CX =3159 BE6860  MOV AL,03H ; =30E3 E8FC13 44E2 CALL PSCLKS ; TIME READ =30E6 B001 MOV AL,01H ; =30E8 E8FF13 44EA CALL PSCLKE ; REGISTER SHIFT =30EB 50  INC BX =3117 43 INC BX =3118 0BF6 OR SI,SI =311A 75DB 30F7 JNZ GETTM02 ; JUMP IF CNT1 NE 0 =311C B108 MOV CL,8 ; CL = COUNTER (CNT MOV SI,OFFSET WEEK CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 50 =315C 03F0 ADD SI,AX =315E BF5460 MOV DI,OFFSE PUSH AX =30EC EC IN AL,DX ; AL = LSB (SEC.) =30ED D0E8 SHR AL,1 ; CF = READ DATA (1BIT) =30EF D1DD RCR BP,1 ; BP = READ 1) =311E E9D8FF 30F9 JMP GETTM021 = GETTM022: =3121 8BC5 MOV AX,BP =3123 8827 MOV [BX],AH ; =3125 5D POP BP =   T STATUSWK =3161 B90300 MOV CX,3 =3164 F3A4 REP MOVS AL,AL = ; DAY =3166 A01560 MOV AL,SYSDAY =3169 E81F00 318B CALL GETNIBBLE =316C 0D3030  $ =5FFA 00 INTTMEVEN DB 0 ; INTTM COUNTER =5FFB 01 DISPREQ DB 1 ; REQUEST TO DISPLAY STATUS LINE =5FFC 01 DISPREQKB DB 1 ; REQUEST TO DISPLAY KB MODE =5 ' ' =6037 43415020414C STATUSKB DB 'CAP ALT GR1 GR2 ' 542047523120 475232202020 20 =604A 73703A DB 'sp:' =604D 392020202020 STATUSSP DB '9',' '  OR AX,3030H =316F A35D60 MOV STATUSDD,AX = ; HOUR =3172 A01460 MOV AL,SYSHOUR =3175 E81300 318B CALL GETNIBBLE =3178 0D3030 FFD 00 INTKBFLG DB 0 ; REQUEST KEY-IN FLAG =5FFE 00 KBSWSAV DB 0 ; KB STATUS SAVED =5FFF FF KBSWSAV1 DB 0FFH ; =6000 00 KBSFSAV DB  20 =6054 20202020 STATUSWK DB ' ' =6058 2020 DB ' ' =605A 2020 STATUSMM DW ' ' CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1  OR AX,3030H =317B A36360 MOV STATUSHH,AX = ; MINUTES =317E A01360 MOV AL,SYSMIN =3181 E80700 318B CALL GETNIBBLE =3184 0D3030 OR AX,303 0 ; CAPS STATUS SAVED =6001 01 KBSFSAV1 DB 1 ; = 101F STATUSKB_AD EQU 101FH = 000F KBSTBUFSZ EQU 15 ; = 6002 KBSTBUF EQU OFF PAGE 52 =605C 2F DB '/' =605D 2020 STATUSDD DW ' ' =605F 2F DB '/' =6060 2020 STATUSYY DW ' ' =6060H =3187 A36660 MOV STATUSMIN,AX =318A C3 RET = ;********************************************************************** = ;* GETNIBBLE SET $ ; KB MODE ATTRIBUTE BUFFER =6002 8080808080 DB 80H,80H,80H,80H,80H =6007 8080808080 DB 80H,80H,80H,80H,80H =600C 8080808080 DB 80H,80H,80H,80H,80H = 2 20 DB ' ' =6063 2020 STATUSHH DW ' ' =6065 3A DB ':' =6066 2020 STATUSMIN DW ' ' =6068 53756E4D6F6E WEEK DB  * = ;* INPUT AL ; 'B7--B4,B3--B0' * = ;* OUTPUT AH ; '0000 ,B3--B0' * = ;*  ; = ; SYSTEM TIME = ; =6011 00 SYSTMFLG DB 0 ; 0 = NOT CARE CLOCK = ; 1 = WRITING CLOCK NOW =  'SunMonTueWedThuFriSat' 547565576564 546875467269 536174 =607D 64 TMCHK DB 100 ; SYSTEM-TIMER CHECK =10 S =607E 0A REPDELAY DB 10 ; REPEAT--DELAY TIME =500MS =607F  AL ; '0000 ,B7--B4' * = ;********************************************************************** = GETNIBBLE: =318B 51 PUSH CX =318C 8AC8  ; 2 = REWRITE CLOCK = 6012 SYSTM EQU $ =6012 00 SYSSEC DB 0 ; SEC BCD =6013 00 SYSMIN DB 0 ; MIN 01 REPRATE DB 1 ; REPEAT--RATE = 50MS =6080 05 MODECHK DB 5 ; KB MODE CHECK =500MS =6081 00 SYSTMCHK DB 0 =6082 00 KBREPDELAY D MOV CL,AL =318E 240F AND AL,0FH =3190 8AE0 MOV AH,AL =3192 8AC1 MOV AL,CL =3194 B104D2E8 MOV CL,4 ! SHR AL,CL =3198 59  BCD =6014 00 SYSHOUR DB 0 ; HOUR BCD =6015 00 SYSDAY DB 0 ; DAY BCD =6016 00 SYSMM DB 0 ; MM/DAB 0 =6083 00 KBREPRATE DB 0 =6084 00 KBMODECHK DB 0 = ; =6085 00 GDCBUSYF DB 0 ; GDC BUSY FLAG = ; CP/M ASM86 1.1  POP CX =3199 C3 RET CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 51 = EJECT = ;****Y OF WEEK HEX/HEX = ; =6017 FF OLDMIN DB 0FFH ; SAVE LAST MINUTES ----*R1.131 '83/01/31---- = ; = ; SYSTEM STATUS LINE BUFFER = SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 53 = EJECT = ;********************************************************************** = ****************************************************************** = ; DATA AREA FOR TIMER = ;********************************************************************** = DSEG  ; 123456789012345678901234567890 =6018 202020202020 STATUSLINE DB ' ' 202020202020 202020202020 202020202020 2020 =6032 2020202020 HDMRK DB    ;* REGISTER SAVE ROUTINE * = ;********************************************************************** = CSEG $ = REGSAVE: MOV AL,20H =31F0 E620 OUT ICP1,AL ; OUT EOI TO MASTER PIC (OCW2) =31F2 581F POP AX ! POP DS =31F4 07 POP ES =31F5 2E8E168C60 MOV SS,CS:RS_SS =31FA 2 * = ;********************************************************************** = REGRESTORETM: =324D FA CLI =324E 58 POP AX =324F A3D =319A 2EA38660 MOV CS:RS_AX,AX =319E 58 POP AX =319F 2EA38860 MOV CS:RS_RTN,AX =31A3 2E89268A60 MOV CS:RS_SP,SP =31A8 2E8C168C60 MOV CS:RS_SS,SE8B268A60 MOV SP,CS:RS_SP =31FF 2EFF268860 JMP CS:RS_RTN = CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 54 = ;*******060 MOV TM_RTN,AX =3252 5F5E POP DI ! POP SI =3254 5D5A POP BP ! POP DX =3256 595B POP CX ! POP BX = ; =3258 B020 MOV S =31AD BCCE60 MOV SP,CS:OFFSET INTSTACKBASE =31B0 8CC8 MOV AX,CS =31B2 8ED0 MOV SS,AX =31B4 2EA18660 MOV AX,CS:RS_AX =31B8 061E PUSH ES*************************************************************** = ;* REGSAVETM REGISTER SAVE FOR TIMER * = ;*********************************************************************AL,20H =325A E620 OUT ICP1,AL ; OUT EOI TO MASTER PIC (OCW2) =325C 581F POP AX ! POP DS =325E 07 POP ES =325F 2E8E16D460 MOV SS,CS:TM_SS =3264 2E8B26D260  ! PUSH DS =31BA 5053 PUSH AX ! PUSH BX =31BC 5152 PUSH CX ! PUSH DX =31BE 5556 PUSH BP ! PUSH SI =31C0 57 PUSH DI =31C1 2E8E068C60 MOV ES,CS:RS_S* = REGSAVETM: =3204 2EA3CE60 MOV CS:TM_AX,AX =3208 58 POP AX =3209 2EA3D060 MOV CS:TM_RTN,AX =320D 2E8926D260 MOV CS:TM_SP,SP =3212 2E8C16D MOV SP,CS:TM_SP =3269 2EFF26D060 JMP CS:TM_RTN = ;********************************************************************* = ;* LOCAL STACK AREA S ; *R1.103 '82 8/25 =31C6 2E8B1E8A60 MOV BX,CS:RS_SP =31CB 268B4704 MOV AX,ES:04[BX] =31CF 250002 AND AX,0200H =31D2 7401 31D5 JZ REGSAVE1 =31D4 FB 460 MOV CS:TM_SS,SS =3217 BC1661 MOV SP,CS:OFFSET TMSTACKBASE =321A 8CC8 MOV AX,CS =321C 8ED0 MOV SS,AX =321E 2EA1CE60 MOV AX,CS:TM_AX =32 * = ;********************************************************************* CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 55 =  STI = REGSAVE1: =31D5 8CC8 MOV AX,CS =31D7 8ED8 MOV DS,AX =31D9 8EC0 MOV ES,AX =31DB A18660 MOV AX,RS_AX =31DE FC 22 061E PUSH ES ! PUSH DS =3224 5053 PUSH AX ! PUSH BX =3226 5152 PUSH CX ! PUSH DX =3228 5556 PUSH BP ! PUSH SI =322A 57 PUSH DI =322B 2E8E0 DSEG $ =6086 0000 RS_AX DW 0 =6088 0000 RS_RTN DW 0 =608A 0000 RS_SP DW 0 =608C 0000 RS_SS DW 0 =608E INTSTACK RW 32 = 60CE  CLD =31DF FF268860 JMP RS_RTN ; RETURN WITHOUT POP STACK = ;********************************************************************** = ;* REGISTER RESTORE ROUTI6D460 MOV ES,CS:TM_SS =3230 2E8B1ED260 MOV BX,CS:TM_SP =3235 268B4704 MOV AX,ES:04[BX] =3239 250002 AND AX,0200H =323C 7401 323F JZ REGSAVETM1 =323E INTSTACKBASE EQU $ =60CE 0000 TM_AX DW 0 =60D0 0000 TM_RTN DW 0 =60D2 0000 TM_SP DW 0 =60D4 0000 TM_SS DW 0 =60D6 TMSTACK RW 32 NE * = ;********************************************************************** = REGRESTORE: =31E3 FA CLI =31E4 58 POP AX FB STI = REGSAVETM1: =323F 8CC8 MOV AX,CS =3241 8ED8 MOV DS,AX =3243 8EC0 MOV ES,AX =3245 A1CE60 MOV AX,= 6116 TMSTACKBASE EQU $ = ;********************************************************************** = ;* DATA AREA FOR KB ROUTINES * =  =31E5 A38860 MOV RS_RTN,AX =31E8 5F5E POP DI ! POP SI =31EA 5D5A POP BP ! POP DX =31EC 595B POP CX ! POP BX = ; =31EE B020 TM_AX =3248 FC CLD =3249 FF26D060 JMP TM_RTN = ;********************************************************************** = ;* REGRESTORETM    ;********************************************************************** = 0040 KBFIFOSZ EQU 64 =6116 00 KBIN DB 0 =6117 00 KBOUT DB 0 =6118 KBFIFO RB TP =3297 FE066461 INC CLICKSTC =329B 3A066361 CMP AL,CLICKSTT =329F 75E8 3289 JNE CLICKST =32A1 3C80 CMP AL,CLICKRDY =32A3 75E4 3289 JNE CLICKST MOV AH,0 = ;----- R1.107 07/21/'83 (DELETE) ----- =32AD 53 PUSH BX =32AE 8AC1 MOV AL,CL = ; =32B0 BE2762 MOV SI,OFKBFIFOSZ =6158 00 KBIND DB 0 =6159 00 SFKEYFLG DB 0 =615A 0000 SFKEYPTR DW 0 =615C 00 KBSW0 DB 0 =615D 00 KBSW1 DB 0 =615E 00 MINFLG  =32A5 8AC4 MOV AL,AH =32A7 E660 OUT CLICKWP,AL = CLICKRET: =32A9 C3 RET = ; = ; = 0031 CLICKFSET CNTTBL =32B3 803ECC6200 CMP ESCMODE,0 = = ; = ; ESCMODE = 0 ; NOT IN ESC MODE = ; ESCMODE = 1 ; GOT "ESC" CHARACTER IN ESC MODE =  DB 0 =615F 00 CLICKFLG DB 0 =6160 00 SYSKEYINFLG DB 0 =6161 00 SYSDSPFLG DB 0 =6162 00 SYSDSPFSAV DB 0 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 CuCNT1 EQU 31H ; MELODY CONTROL CMD NO.1 = 0063 CLICKCNTBEL EQU 63H ; CONTOROL CMD BELL SOUND = 0038 CLICKCLICK EQU 38H ; CLICK SOUND 20MS,710HZ = 0060  ; 2 ; GOT FIRST CHARACTER FOLLOWING "ESC" IN ESC MODE = ; 3 ; GOT SECOND CHARACTER IN ESC MODE = ; : : stomized Basic I/O System V1 PAGE 56 = EJECT = CSEG $ = ;****************************************************************** CLICKSTP EQU 60H ; READ STATUS PORT = 0060 CLICKWP EQU 60H ; WRITE PORT = 0080 CLICKRDY EQU 80H ; READY TO RECEIVE CMD =  : = ; : : : = ; n ; GOT nTH CHARACTER IN ESC MODE = ; =32B8 7428 32E2 JE**** = ;* KEY-CLICK * = ;********************************************************************** = KBCLICK: =326E 50 DSEG $ =6163 00 CLICKSTT DB 0 ; TEMPORARY STATUS =6164 00 CLICKSTC DB 0 ; TEMP COUNTER = INCLUDE CONOUT.LIB = ; '83 07/21 =  CONOUT002 ; SEARCH ASCII CONTROL CODE = ; TABLE = ; = ; NOW,WE ARE IN ESC MODE = ; =  PUSH AX =326F 51 PUSH CX =3270 B031 MOV AL,CLICKCNT1 ; CONTROL CMD FOR BELL SOUND =3272 E80D00 3282 CALL CLICKOUT ; TO SOUND LSI PD1771C-005 =3275 B063  ;********************************************************************** = ;* * CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V ; SET INPUT CODE TO ESC BUFFER = ; = CONOUT000: =32BA 803ECC6228 CMP ESCMODE,ESCBUFFSZ*2 ; INPUT DATA IS OVERFLOWED = ; *** Change following line to avoid J MOV AL,CLICKCNTBEL =3277 E80800 3282 CALL CLICKOUT =327A B038 MOV AL,CLICKCLICK =327C E80300 3282 CALL CLICKOUT =327F 59 POP CX =3280 58 1 PAGE 57 = ;* CONOUT (CONSOLE OUTPUT) * = ;* * = G too far *** = ; *** JG CONOUT004 ; IN ESC BUFFER =32BF 7E03 32C4 jng conoutnxt ; *** RMG / NECIS *** 9-2-83 =32C1 E98000 3344 jmp conout004 ;  POP AX =3281 C3 RET = ; = CLICKOUT: =3282 C606646100 MOV CLICKSTC,0 =3287 8AE0 MOV AH,AL = CLICKST: = ;********************************************************************** = CSEG $ = CONOUT: = ;******************************************************************* RMG / NECIS *** 9-2-83 = conoutnxt: ; *** RMG / NECIS *** 9-2-83 =32C4 8B1EA262 MOV BX,ESCPTR =32C8 8807 MOV [BX],AL =32CA FF06A262 IN3289 803E646102 CMP CLICKSTC,2 =328E 7419 32A9 JE CLICKRET =3290 E460 IN AL,CLICKSTP =3292 A26361 MOV CLICKSTT,AL =3295 E460 IN AL,CLICKS****** = ;* CHECK ESC MODE * = ;********************************************************************** =32AA FC CLD =32AB B400  C ESCPTR =32CE FE06CC62 INC ESCMODE = ; = ; CHECK IF ESCMODE = 2 (FIRST CHARACTER FOLLOWING "ESC") = ; =32D2 803ECC6202 CMP ESCMODE,2  CALL LOOKUP ; TABLE LOOK UP =3318 803ECC6202 CMP ESCMODE,2 =331D 7504 3323 JNE CONOUT003 =331F 891ECD62 MOV ESCWTG,BX ; SET WTG =  OUTPUT BX=JMP TABLE * = ;********************************************************************** = LOOKUP: =334E 803C00 CMP BYTE PTR [SI],0 ; REA=32D7 7406 32DF JE CONOUT001 ; SEARCH FIRST CHARACTER = ; FOLLOWING "ESC" = ; = ; DISPATCH TO WTG (WHERE TO GO) CP/M ASM ; BRANCH TO = CONOUT003: =3323 FFD3 CALL BX ; THE SPECIFIC ROUTINE = ; = ; RETURN TO BDOS = ; = CH TABLE END ? =3351 7409 335C JE LOOKRET =3353 3804 CMP [SI],AL ; CHECK INPUT CHARACTER =3355 7405 335C JE LOOKRET =3357 83C603 ADD SI,3 =335A EBF2 86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 58 = ; =32D9 FF16CD62 CALL ESCWTG =32DD EB46 3325 JMPS CONOUTRET =  CONOUTRET: =3325 803EEC5D09 CMP SPDWK,9 ; *R1.133 '83 03/10 =332A 7416 3342 JE CONOUTRET1 ; IF SKIP *R1.133 '83 03/10 =332C A1EE5D MOV AX,SPD 334E JMPS LOOKUP = LOOKRET: =335C 8B5C01 MOV BX,1[SI] =335F C3 RET = ;********************************************************************** =  ; = CONOUT001: =32DF BE4562 MOV SI,OFFSET ESCTBL1 = CONOUT002: = ;--------------*R1.107 '83 4/25 ------------------------------------- =32E2 2EF606862580CNT =332F 2BC9 SUB CX,CX =3331 2BD2 SUB DX,DX =3333 8A16EC5D MOV DL,SPDWK =3337 B109 MOV CL,9 =3339 2ACA SUB CL,DL ; CL= ;* BELL ROUTINE * = ;********************************************************************** = 0031 MELCNT1 EQU 31H ; MELODY CO TEST ALTRBYTFLG,80H =32E8 7408 32F2 JZ CONOUT0020 =32EA 2EC606783900 MOV ALTRBYT,0 =32F0 EB18 330A JMPS CONOUT0022 = CONOUT0020: =32F2 2EF606862507 9-SPDWK =333B F7E1 MUL CX =333D 8BC8 MOV CX,AX =333F 41 INC CX =3340 E2FE 3340 LOOP $ = CONOUTRET1: ; NTROL CMD NO.1 = 0063 MELCNTBEL EQU 63H ; CONTROL CMD BELL SOUND = 003C MELBEL EQU 3CH ; BELL SOUND 200MS,710HZ = 0039 MELCLICK EQU 39H ;  TEST ALTRBYTFLG,07H ; =32F8 7410 330A JZ CONOUT0022 ; IF NOT ESC CHRACTER MODE =32FA 2EF606862501 TEST ALTRBYTFLG,01H ; =3300 7547 3349 JNZ CONOUT005 ; IF ESC CHARACTER MODE  *R1.133 '83 03/10 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 59 =3342 5B POP BX =3343 C3 RET = CONOU CLICK SOUND 20MS,1202HZ = 0060 MELSTP EQU 60H ; READ STATUS PORT = 0060 MELWP EQU 60H ; WRITE PORT = 0080 MELRDY EQU 80H ; REDY(1 CHR .OUT) =3302 2EC606783989 MOV ALTRBYT,89H = ;-------------- *R1.107 07/21/'83 ----------------------------------- =3308 EB0B 3315 JMPS CONOUT0024 = CONOUT0022: = T004: =3344 E8F200 3439 CALL ESCRESET =3347 EBDC 3325 JMPS CONOUTRET = CONOUT005: =3349 E8D305 391F CALL DATARTN ; DATA CODE OUTPUT =334C EBD7 3325 JMPS TO RECEIVE CMD = DSEG $ =6165 00 MELSTT DB 0 ; TEMPORARY STATUS =6166 00 MELSTC DB 0 ; TEMP COUNTER = ; =  ; *** Reset escape mode for NULs, too... =330A 803ECC6202 cmp escmode,2 ; *** RMG / NECIS *** 9-1-83 =330F 7404 3315 jz conout0024 ; *** RMG / NECIS *** 9-1-83 =3311 3C00  CONOUTRET ; = CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 60 = EJECT = ;****************************************** CSEG $ = BELRTN: =3360 50 PUSH AX =3361 51 PUSH CX =3362 B031 MOV AL,MELCNT1 ; CONTROL CMD FOR BELL SOUND =3364 E81700 337E  CMP AL,00H =3313 7410 3325 JE CONOUTRET ; IF NULL CODE = CONOUT0024: = ;-------------------------------------------------------------------- =3315 E83600 334E **************************** = ;* TABLE LOOK UP * = ;* INPUT SI=TABLE TOP ADDRESS * = ;*   CALL MELOUT ; TO SOUND LSI PD1771C-005 =3367 B063 MOV AL,MELCNTBEL =3369 E81200 337E CALL MELOUT =336C B03C MOV AL,MELBEL =336E E80D00 337E CALL MELOU; ESC NULL ROUTINE CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 62 = EJECT = ;************************************************ = ;* ALTERNATE CHARACTER MODE * = ;* SET/RESET ROUTINE * = ;* ; ESC ( 1 T ; OUTPUT BELL SOUND =3371 B9351F MOV CX,0B7DH*25 ; WAIT FOR 250 MS =3374 E2FE 3374 LOOP $ =3376 B039 MOV AL,MELCLICK =3378 E80300 337E CALL MELOUT =337B********************** = ;* CURSOR POSITION IN NOT ANSI MODE * = ;* ; ESC = L C * = ;************* GAIJI SET * = ;* ; ESC ( 0 ALTERNATE CHR. SET CONTINUE * = ;* ; ESC ( B ALTERNATE CHR. RESET * = ;* 59 POP CX =337C 58 POP AX =337D C3 RET = ; = MELOUT: =337E C606666100 MOV MELSTC,0 =3383 8AE0 ********************************************************* = ESCCUP1: = ; = ; ARE PARAMETERS ALREADY SET IN ESC BUFFER ? = ; =33AC 803ECC6204 C********************************************************************* = ESCALTCHR: = ; = ; IS FINAL CHAR. ALREADY SET IN ESC BUFFER ? = ; =33E9 803ECC6203  MOV AH,AL =3385 803E666102 MELST: CMP MELSTC,2 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 61 =338A 7419 33A5 JE MELRET =338C E460 MP ESCMODE,4 =33B1 7524 33D7 JNE ESCCUP1RET ; NO, SO DO NOTHING =33B3 C606CF6220 MOV LCOFFSET,20H =33B8 BBA462 MOV BX,OFFSET ESCBUFF =33BB 8A4701 MOV AL,1[BX] CMP ESCMODE,3 =33EE 7511 3401 JNE ESCALTRET ; NO SO DO NOTHING =33F0 BBA462 MOV BX,OFFSET ESCBUFF =33F3 8A4701 MOV AL,1[BX] =33F6 BE8A62 MOV  IN AL,MELSTP =338E A26561 MOV MELSTT,AL =3391 E460 IN AL,MELSTP =3393 FE066661 INC MELSTC =3397 3A066561 CMP AL,MELSTT =339B 75E8  =33BE B418 MOV AH,DPLINE-1 =33C0 E81500 33D8 CALL LCCHK =33C3 A2DB64 MOV LA,AL =33C6 8A4702 MOV AL,2[BX] =33C9 B44F MOV AH,COLUMN-1 =33C SI,OFFSET ESCALTPRM =33F9 E852FF 334E CALL LOOKUP =33FC FFD3 CALL BX =33FE E83800 3439 CALL ESCRESET = ESCALTRET: =3401 C3 RET =  3385 JNE MELST =339D 3C80 CMP AL,MELRDY =339F 75E4 3385 JNE MELST =33A1 8AC4 MOV AL,AH =33A3 E660 OUT MELWP,AL = MELRET:B E80A00 33D8 CALL LCCHK =33CE A2DC64 MOV CA,AL =33D1 E8C004 3894 CALL CSWRT =33D4 E86200 3439 CALL ESCRESET = ESCCUP1RET: =33D7 C3  ; = ESCALTSET: =3402 2E800E862501 OR ALTRBYTFLG,01H ; SET ALTERNATE CHR. 1 CHR.OUT =3408 EB06 3410 JMPS ESCALTSET01 = ;---------------*R1.107 '83 4/13 ------------- =33A5 C3 RET = ; = ; = ; = ;********************************************************************** = ;* MISCELLRET = ; = ; =33D8 3C20 LCCHK: CMP AL,20H =33DA 7302 33DE JAE LCCHK01 ; R1.108 '83 07/07 =33DC B020 MOV AL,20H = ------------------------ = ESCALTSET00: =340A 2E800E862502 OR ALTRBYTFLG,02H ; SET ALTERNATE CHAR. CONTINUE FLAG = ;---------------------------------------------------------------------- = ANEOUS ROUTINES * = ;* * = ;********************************************************************** =  LCCHK01: =33DE 2A06CF62 SUB AL,LCOFFSET =33E2 3AC4 CMP AL,AH =33E4 7202 33E8 JB LCCHKRET =33E6 8AC4 MOV AL,AH =33E8 C3 LCCHKRET: RET CP ESCALTSET01: =3410 2EC606783989 MOV ALTRBYT,89H ; SET ALTERNATE CHARACTER FLAG =3416 C3 RET ; MSB ON = GAIJI =  ESCRTN: =33A6 FE06CC62 INC ESCMODE ; ENTER ESC MODE =33AA C3 RET = ; = ESCNULL: =33AB C3 RET /M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 63 = EJECT = ;**********************************************************************   ; VALUE 9= HANKAK = = ;---------------*R1.107 '83 4/15 -------------------------------------- = ESCALTRESET: =3417 2E802686258C AND ALTRBYTFLG,8CH ; RESET ALTERNATE CHAR. CONTINUE FLAGLL BUFFCLR =3454 B90A00 MOV CX,ANSIPRMTBLSZ =3457 BB6861 MOV BX,OFFSET ANSIPRMTBL =345A E80100 345E CALL BUFFCLR =345D C3 RET = ; =  ESCANSI1: =347B E81300 3491 CALL ESCGENPRM ; GENERATE PARAMETER TABLE =347E BE5762 MOV SI,OFFSET ESCANSITBL ; AL=FINAL CHARACTER =3481 E8CAFE 334E CALL LOOKUP =3484 FFD3  =341D 2EC606783900 MOV ALTRBYT,0 ; RESET ALTERNATE CHARACTER FLAG =3423 C3 RET = = ;********************************************************************* = ;*  ; = BUFFCLR: =345E C7070000 MOV WORD PTR [BX],0 ; CX=COUNTER =3462 43 INC BX ; BX=TBL ADDRESS =3463 E2F9 345E LOOP BUFF CALL BX =3486 803E5E6101 CMP MINFLG,1 =348B 7403 3490 JE ESCANSIRET ; IF ESC [ < =348D E8A9FF 3439 CALL ESCRESET = ESCANSIRET: =3490 C3  ATTRIBUTE SET ROUTINE * = ;* ; ESC 01H XXH * = ;*******************************************************************CLR =3465 C3 RET CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 65 = EJECT = ;************************** RET CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 66 = EJECT = ;****************************************** = ESCATT: = ; = ; IS FINAL CHAR. ALREADY SET IN ESC BUFF ? = ; =3424 803ECC6203 CMP ESCMODE,3 =3429 750D 3438 JNE ******************************************** = ;* ESCAPE ANSI MODE PROCEDURE * = ;* ; ESC [ PS;PS;......FINAL CHAR. * = ****************************** = ;* ESCGENPRM GENERATE PARAMETER TABLE ROUTINE * = ;* * = ;*****ESCATTRET ; NO SO DO NOTHING =342B BBA462 MOV BX,OFFSET ESCBUFF CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 64 =342E 8A4701 MOV  ;********************************************************************** = ESCANSI: =3466 803ECC6202 CMP ESCMODE,2 =346B 7423 3490 JE ESCANSIRET ; PARAMETER IS NOT STILL IN PARAME***************************************************************** = ESCGENPRM: = =3491 5657 PUSH SI ! PUSH DI =3493 5351 PUSH BX ! PUSH CX =3495 BEA462 MOV SI,OFFSE AL,1[BX] =3431 2EA2C539 MOV ATTRIB,AL ; SET ATTRIBUTE BIT =3435 E80100 3439 CALL ESCRESET = ESCATTRET: =3438 C3 RET = = ;---------------TER = ; BUFFER SO , DO NOTHING = ; = ; ANSI MODE PARAMETERS IN PARAMETER BUFFER = ; IF INPUT CHARACTER IS = T ESCBUFF ; =3498 8BFE MOV DI,SI =349A 46 INC SI =349B BB6861 MOV BX,OFFSET ANSIPRMTBL = =349E C606676100 MOV ANSINOP,0 =34A3 FF0EA262 -------------------------------------------------------- = = ;********************************************************************** = ;* EXIT ESC SEQUENCE * = ; (1) NUMERIC OR PARAMETER SEPARATER (";") = ; THEN GO THROUGH = ; (2) OTHERWISE, TREAT AS A FINAL CHARACTER = ; =346D 3D3 DEC ESCPTR = ESCGENPRM01: =34A7 3B3EA262 CMP DI,ESCPTR =34AB 7429 34D6 JE ESCGENPRMRET =34AD 47 INC DI = ; COUNT UP NUMERIC C ;********************************************************************** = ESCRESET: =3439 C606CC6200 MOV ESCMODE,0 ; CLEAR ESC MODE COUNTER =343E C706CD620000 MOV ESC000 CMP AX,30H =3470 7209 347B JB ESCANSI1 =3472 3D3A00 CMP AX,3AH =3475 7219 3490 JB ESCANSIRET ; NUMERIC CHARACTER THEN GO THROUGH =3477 3C3B HARACTERS = ; =34AE B90000 MOV CX,0 = ESCGENPRM02: =34B1 803D3B CMP BYTE PTR [DI],3BH ; SEPARATER (';') ? =34B4 740A 34C0 JE ESCGEWTG,0 ; CLEAR ESC WTG =3444 C706A262A462 MOV ESCPTR,OFFSET ESCBUFF ; INITIALIZE ESC BUFFER =344A B91400 MOV CX,ESCBUFFSZ =344D 8B1EA262 MOV BX,ESCPTR =3451 E80A00 345E CA CMP AL,3BH =3479 7415 3490 JE ESCANSIRET ; SEPARATER ";" THEN GO THROUGH = ; = ; NOW ASSUME INPUT CHARACTER AS A FINAL CHARACTER = ; =  NPRM03 =34B6 3B3EA262 CMP DI,ESCPTR ; FINAL CHARACTER ? =34BA 7404 34C0 JE ESCGENPRM03 =34BC 4147 INC CX ! INC DI =34BE EBF1 34B1 JMPS ESCGENPRM02 = DATA TO [BX] * = ;* .IF NOC > 5 THEN TREAT NOC = 5 * = ;* IF NOC = 0 THEN SET 0 TO [BX] * = ;******************************************** = ;* ATTRIBUTE OUTPUT ROUTINE * = ;* * =  ; = ; CONVERT DECIMAL TO BINARY = ; AND SET THE PARAMETER TO ANSIPRMTBL = ; = ; SI = INPUT BUFFER ADDRESS = ********************************************************************* = DTOB: =34DB 505652 PUSH AX ! PUSH SI ! PUSH DX =34DE 83F905 CMP CX,5 =34E1 7603 34E6 JBE DTOB01  ;* ESCSGR SELECT GRAPHIC RENDITION * = ;* * = ;****************************************************** ; CX = NOC = ; BX = OUTPUT BUFFER ( ANSIPRMTBL ) = ESCGENPRM03: = ; =34C0 E81800 34DB CALL DTOB =34C3 FE066761  =34E3 B90500 MOV CX,5 = DTOB01: =34E6 C7070000 MOV WORD PTR [BX],0 ;CLEAR OUTPUT WORD =34EA 83F900 CMP CX,0 =34ED 7419 3508 JE DTOBRE**************** = ESCSGR: = ; SAVE REGISTER =350C 5056 PUSH AX ! PUSH SI =350E 57 PUSH DI =350F C6067C6100 MOV ATTRIBWK,0 ; CLEAR ATTRIBUT INC ANSINOP =34C7 803E67610A CMP ANSINOP,ANSIPRMTBLSZ =34CC 7F08 34D6 JG ESCGENPRMRET =34CE 8BF746 MOV SI,DI ! INC SI =34D1 83C302 ADD BX,2 =34D4 EBD1 T = DTOB02: = ;--------------------- *R1.133 '83 03/10 -------------------- = ; MOV AX,10 = ; MUL WORD PTR [BX] ; DX,AX = [BX]*10 =34E WORK =3514 C6067D6100 MOV ATTRIBS,0 =3519 803E676100 CMP ANSINOP,0 =351E 7504 3524 JNE ESCSGR00 =3520 FE066761 INC ANSINOP = ESCSGR00: =  34A7 JMPS ESCGENPRM01 = ESCGENPRMRET: =34D6 595B5F5E POP CX ! POP BX ! POP DI ! POP SI =34DA C3 RET CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 EF 8B07 MOV AX,[BX] ; =34F1 D1E0 SHL AX,1 ; =34F3 8BD0 MOV DX,AX ; =34F5 D1E0 SHL AX,1  ; = ; CONVERT VT100 PARAMETER TO GDC LSI ( PD7220) PARAMETER =3524 BE6861 MOV SI,OFFSET ANSIPRMTBL = ESCSGR01: =3527 803E676100 CMP ANSINOP,0  PAGE 67 = EJECT = ;********************************************************************** = ;* DECIMAL (ASCII) TO BINARY CONVERSION  ; =34F7 D1E0 SHL AX,1 ; =34F9 03C2 ADD AX,DX ; = ;------------------------------------------------------------ =34FB 8A14 ; END OF PARAMS ? =352C 7423 3551 JE ESCSGRRET ; YES =352E 8B3C MOV DI,WORD PTR [SI] =3530 83FF25 CMP DI,37 =3533 7F13 3548 JG ESCSGR02 ; IGNORE ATTRROUTINE * = ;* * = ;* * = ;*  MOV DL,BYTE PTR [SI] =34FD 81E20F00 AND DX,0FH =3501 03C2 ADD AX,DX ; =3503 8907 MOV [BX],AX ; [BX] = [BX]* 10 + [SI]AND 0FH =3505 46 IBUTE =3535 83FF10 CMP DI,16 =3538 7504 353E JNE ESCSGR011 =353A FE067D61 INC ATTRIBS = ESCSGR011: =353E 81C70162 ADD DI,OFFSET ATTRTBL =3542 8 INPUT SI = TOP ADDRESS OF INPUT STRING * = ;* CX = NUMBER OF CHARACTERS NOC (MAX 5 CHARS) * = ;* BX = TOP ADDRESS OF OUTPUT (1 WORD ; *  INC SI ; =3506 E2E7 34EF LOOP DTOB02 ; LOOP TILL CX=0 = DTOBRET: =3508 5A5E POP DX ! POP SI =350A 58 POP A05 MOV AL,[DI] ; GET ATTRIBUTE =3544 08067C61 OR ATTRIBWK,AL = ESCSGR02: =3548 FE0E6761 DEC ANSINOP =354C 83C602 ADD SI,2 =354F E = ;* IGNORE OVERFLOWED * = ;* DATA) * = ;* OUTPUT .SET CONVERTEDAX =350B C3 RET CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 68 = EJECT = ;*************************** BD6 3527 JMPS ESCSGR01 = ESCSGRRET: =3551 A07C61 MOV AL,ATTRIBWK =3554 24E0 AND AL,0E0H =3556 3C00 CMP AL,0 =3558 7511 356B 96 BE6861 MOV SI,OFFSET ANSIPRMTBL =3599 803E676102 CMP ANSINOP,2 =359E 7D0F 35AF JGE ESCCUDRET ; ERROR =35A0 8B0C MOV CX,[SI] ; GET PRM =35A2 83F900 5EB JGE ESCCUBRET ; ERROR =35DC 8B0C MOV CX,[SI] ; GET PRM =35DE 83F900 CMP CX,0 =35E1 7503 35E6 JNE ESCCUB01 =35E3 B90100 MOV CX,1 =  JNE ESCSGRRET1 =355A 800E7C6180 OR ATTRIBWK,80H =355F 803E7D6100 CMP ATTRIBS,0 =3564 7405 356B JE ESCSGRRET1 =3566 80267C611F AND ATTRIBWK,1FH ; SET SECRET =  CMP CX,0 =35A5 7503 35AA JNE ESCCUD01 =35A7 B90100 MOV CX,1 = ESCCUD01: =35AA E8F802 38A5 CALL LFRTN =35AD E2FB 35AA LOOP ESCCUD ESCCUB01: =35E6 E8FA02 38E3 CALL BSRTN =35E9 E2FB 35E6 LOOP ESCCUB01 = ESCCUBRET: =35EB 595E POP CX ! POP SI =35ED C3 RET ESCSGRRET1: =356B A07C61 MOV AL,ATTRIBWK =356E 2EA2C539 MOV ATTRIB,AL =3572 5F5E POP DI ! POP SI =3574 58 POP AX =3575 C3 01 = ESCCUDRET: =35AF 595E POP CX ! POP SI =35B1 C3 RET = ;********************************************************************** = ;*  CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 71 = EJECT = ;******************************************************************RET CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 69 = ;********************************************************************** = ;*  ESCCUF ESC CURSOR FORWARD * = ;********************************************************************** = ESCCUF: =35B2 5651 PUSH SI ! PUSH CX =3**** = ;* ESCCUP0 ESC DIRECT CURSOR ADDRESSING * = ;********************************************************************** = ESCCUP0: =35EE 56  ESCCUU ESC CURSOR UP * = ;********************************************************************** = ESCCUU: =3576 5651 PUSH SI ! PUSH CX =35785B4 BE6861 MOV SI,OFFSET ANSIPRMTBL =35B7 803E676102 CMP ANSINOP,2 =35BC 7D0F 35CD JGE ESCCUFRET ; ERROR =35BE 8B0C MOV CX,[SI] ; GET PRM =35C0 83F900  PUSH SI =35EF BE6861 MOV SI,OFFSET ANSIPRMTBL =35F2 803E676100 CMP ANSINOP,0 =35F7 7407 3600 JE ESCCUP000 ; IF ESC[H =35F9 803E676102 CMP ANSINOP,2 =3 BE6861 MOV SI,OFFSET ANSIPRMTBL =357B 803E676102 CMP ANSINOP,2 =3580 7D0F 3591 JGE ESCCUURET ; ERROR =3582 8B0C MOV CX,[SI] ; GET PRM =3584 83F900  CMP CX,0 =35C3 7503 35C8 JNE ESCCUF01 =35C5 B90100 MOV CX,1 = ESCCUF01: =35C8 E8EC02 38B7 CALL FFRTN =35CB E2FB 35C8 LOOP ESCCU5FE 7529 3629 JNE ESCCUP0RET = ESCCUP000: =3600 8B04 MOV AX,[SI] ; GET PL LINE ADDRESS =3602 3C00 CMP AL,0 =3604 7408 360E JE ESCCU CMP CX,0 =3587 7503 358C JNE ESCCUU01 =3589 B90100 MOV CX,1 = ESCCUU01: =358C E8FA02 3889 CALL VURRTN =358F E2FB 358C LOOP ESCCUU0F01 = ESCCUFRET: CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 70 =35CD 595E POP CX ! POP SI =35CF C3 RET P00 =3606 2C01 SUB AL,1 =3608 3C18 CMP AL,DPLINE-1 =360A 7202 360E JB ESCCUP00 =360C B018 MOV AL,DPLINE-1 = ESCCUP00: =360E A2DB64 1 = ESCCUURET: =3591 595E POP CX ! POP SI =3593 C3 RET = ;********************************************************************** = ;*  = ;********************************************************************** = ;* ESCCUB ESC CURSOR BACKWARD * = ;************************************ MOV LA,AL =3611 8B4402 MOV AX,2[SI] ; GET PC COLUMN ADDRESS =3614 3C00 CMP AL,0 =3616 7408 3620 JE ESCCUP01 =3618 2C01 SUB AL,1  ESCCUD ESC CURSOR DOWN * = ;********************************************************************** = ESCCUD: =3594 5651 PUSH SI ! PUSH CX =35********************************** = ESCCUB: =35D0 5651 PUSH SI ! PUSH CX =35D2 BE6861 MOV SI,OFFSET ANSIPRMTBL =35D5 803E676102 CMP ANSINOP,2 =35DA 7D0F 3 =361A 3C4F CMP AL,COLUMN-1 =361C 7202 3620 JB ESCCUP01 =361E B04F MOV AL,COLUMN-1 = ESCCUP01: =3620 A2DC64 MOV CA,AL =3623 E86E02  INC ESCEDCASE ; ESCEDCASE = ; = 0 KBSL2 = 0 , KBSAD1 <= AX = ; = 1 KBSL2 <>0 , KBSAD1 <= AX = A7 49 DEC CX =36A8 E87C05 3C27 CALL KBCRTC0 =36AB EB0E 36BB JMPS ESCED99 = ; CASE = 2 = ESCED02: =36AD 8B0ED362 MOV CX,ESC 3894 CALL CSWRT =3626 E810FE 3439 CALL ESCRESET = ESCCUP0RET: =3629 5E POP SI =362A C3 RET CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O ; = 2 KBSL2 <>0 , KBSAD1 > AX = ESCED00: = ; CALCULATE DISPLAY LENGTH IN VIDEO MEMORY = ; ESCEDSL1 = (KBSL1/19*16)*80 = ; EDSL2 =36B1 030EE964 ADD CX,KBSAD2 =36B5 2BC8 SUB CX,AX =36B7 49 DEC CX =36B8 E86C05 3C27 CALL KBCRTC0 = ESCED99: =36BB E95300 3711  System V1 PAGE 72 = EJECT = ;********************************************************************** = ;* ESCED ESC ERASE ESCEDSL2 = (KBSL2/19*16)*80 = ; =3657 50 PUSH AX =3658 A1E764 MOV AX,KBSL1 =365B E8D104 3B2F CALL SL1CHNG =365E A3D162 MOV ESCEDSL1,AX =366 JMP ESCEDRET = ; = ; ESC [ 1 J = ; = ; CASE = 0 / 1 = ESCED10: =36BE 803ED06202 CMP ESCEDCASE,2 =36C3 740E * = ;* * = ;* ESC [J / ESC[0J : ERASE FROM CURSOR TO END OF SCREEN * = 1 A1EB64 MOV AX,KBSL2 =3664 E8C804 3B2F CALL SL1CHNG =3667 A3D362 MOV ESCEDSL2,AX =366A 58 POP AX =366B 8B0C MOV CX,[SI] =366D 83F903  36D3 JE ESCED11 =36C5 2B06E564 SUB AX,KBSAD1 =36C9 8BC8 MOV CX,AX =36CB A1E564 MOV AX,KBSAD1 =36CE E85605 3C27 CALL KBCRTC0 =36D1 EB3E  ;* ESC [1J : ERASE FROM BEGINNING OF SCREEN TO * = ;* CURSOR * = ;* ESC [2J : ERASE ENTIRE SCREEN  CMP CX,3 =3670 7D49 36BB JGE ESCED99 =3672 83F901 CMP CX,1 =3675 7447 36BE JE ESCED10 =3677 83F902 CMP CX,2 =367A 7470 36EC JE 3711 JMPS ESCEDRET = ; CASE = 2 = ESCED11: =36D3 2B06E964 SUB AX,KBSAD2 =36D7 8BC8 MOV CX,AX =36D9 A1E964 MOV AX,KBSAD2 =36DC * = ;********************************************************************** = ESCED: =362B 56 PUSH SI =362C BE6861 MOV SI, OFFSET ANSIPRMTBL =  ESCED20 = ; ESC [ J / ESC [ 0 J CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 73 = ; = ; CASE = 0 =367C E84805 3C27 CALL KBCRTC0 =36DF A1E564 MOV AX,KBSAD1 =36E2 8B0ED162 MOV CX,ESCEDSL1 =36E6 49 DEC CX =36E7 E83D05 3C27 CALL KBCRTC0 CP/M ASM86 1.1 ; GET SCREEN MEMORY ADDRESS IN AX = ; =362F E82206 3C54 CALL KBCSAD =3632 50 PUSH AX =3633 803E676101 CMP ANSINOP,1 =3638 7E03 363D  803ED06200 CMP ESCEDCASE,0 =3681 750E 3691 JNE ESCED01 =3683 B9CF07 MOV CX,1999 =3686 030EE564 ADD CX,KBSAD1 =368A 2BC8 SUB CX,AX =368C E89805 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 74 =36EA EB25 3711 JMPS ESCEDRET = ; = ; ESC [ 2 J = ; =  JLE ESCED000 =363A E9D400 3711 JMP ESCEDRET = ; CHECK CURSOR POSITION ON THE SCREEN DISPLAYED = ESCED000: =363D C606D06200 MOV ESCEDCASE,0 =3642 833EEB6400  3C27 CALL KBCRTC0 =368F EB2A 36BB JMPS ESCED99 = ; CASE = 1 = ESCED01: =3691 803ED06201 CMP ESCEDCASE,1 =3696 7515 36AD JNE ESCED0 ; CASE = 0 = ESCED20: =36EC 803ED06200 CMP ESCEDCASE,0 =36F1 7508 36FB JNE ESCED21 =36F3 A1E564 MOV AX,KBSAD1 =36F6 B9CF07 MOV  CMP KBSL2,0 =3647 740E 3657 JE ESCED00 =3649 FE06D062 INC ESCEDCASE =364D 3B06E564 CMP AX,KBSAD1 =3651 7D04 3657 JGE ESCED00 =3653 FE06D062 2 =3698 B9FF0F MOV CX,0FFFH =369B 2BC8 SUB CX,AX =369D E88705 3C27 CALL KBCRTC0 =36A0 A1E964 MOV AX,KBSAD2 =36A3 8B0ED362 MOV CX,ESCEDSL2 =36  CX,1999 =36F9 EB13 370E JMPS ESCED22 = ; CASE = 1 / 2 = ESCED21: =36FB A1E564 MOV AX,KBSAD1 =36FE 8B0ED162 MOV CX,ESCEDSL1 =3702 49 N DO NOTHING =3735 E81C05 3C54 CALL KBCSAD =3738 50 PUSH AX =3739 2AED SUB CH,CH =373B 833C00 CMP WORD PTR [SI],0 =373E 740D 374D JE ESCEL0 =376D 7403 3772 JE ESCCHKLRET ; IF NOT ESC RESET MODE = ; =376F E84F00 37C1 CALL ESCON ; ESC RESET MODE = ; = ESCCHK DEC CX =3703 E82105 3C27 CALL KBCRTC0 =3706 A1E964 MOV AX,KBSAD2 =3709 8B0ED362 MOV CX,ESCEDSL2 =370D 49 DEC CX = ESCED22 =3740 8A0EDC64 MOV CL,CA =3744 2BC1 SUB AX,CX =3746 833C01 CMP WORD PTR [SI],1 =3749 740D 3758 JE ESCEL3 ; ESC [1K =374B EB08 3755 JMPS ESCELRET: =3772 C3 RET = ; = ;********************************************************************** = ;* CHECK ESC SET MODE / CURSOR POSITION : =370E E81605 3C27 CALL KBCRTC0 = ESCEDRET: =3711 58 POP AX =3712 E83904 3B4E CALL KBCSRO =3715 5E POP SI =3716 C3 RL2 = ; ESC [K / ESC [0K = ESCEL0: =374D B14F MOV CL,79 =374F 2A0EDC64 SUB CL,CA =3753 EB03 3758 JMPS ESCEL3 = ; ESC [ * = ;********************************************************************** = ESCCHKH: =3773 803E5E6100 CMP MINFLG,0 =3778 7405 377F JE ESCCHKH010 ; ET = CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 75 = EJECT = ;*************************************************************1K = ESCEL2: =3755 B94F00 MOV CX,79 = ESCEL3: =3758 E8CC04 3C27 CALL KBCRTC0 =375B 58 POP AX =375C E8EF03 3B4E CALL KBCSROIF CURSOR POSITION = ; =377A E80600 3783 CALL ESCOFF ; ESC SET MODE =377D EB03 3782 JMPS ESCCHKHRET = ; = ESCCHKH010: =377F E86CFE ********* = ;* ESCEL ESC ERASE LINE * = ;* ESC [K / [0K : ERASE FROM CURSOR TO END OF LINE * = ;* ESC [1K  = ESCELRET: =375F 5E POP SI =3760 C3 RET = ESCIL: = ESCDL: = ESCIC: = ESCDC: =3761 C3  35EE CALL ESCCUP0 ; CURSOR POSITION = ; = ESCCHKHRET: =3782 C3 RET = ; = ; = ;****** : ERASE FROM BEGINNING OF LINE TO * = ;* CURSOR * = ;* ESC [2K : ERASE ENTIRE LINE CONTAINING CURSOR * =  RET = ; CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 76 = EJECT = ;****************************************************************************** = ;* ESCOFF * = ;******************************************************************** ;********************************************************************** = ESCEL: =3717 56 PUSH SI =3718 BE6861 MOV SI,OFFSET ANSIPRMTBL =371B 803E676101 CMP ******************************************************** = ;* ESCMIN * = ;********************************************************************** =376** = ESCOFF: =3783 5651 PUSH SI ! PUSH CX =3785 BE6861 MOV SI,OFFSET ANSIPRMTBL =3788 803E676101 CMP ANSINOP,1 =378D 752A 37B9 JNE ESCOFF050  ANSINOP,1 =3720 7F3D 375F JG ESCELRET =3722 833C03 CMP WORD PTR[SI],3 =3725 7D38 375F JGE ESCELRET = ; GET SCREEN MEMORY ADDRESS IN AX = ; 2 C6065E6101 ESCMIN: MOV MINFLG,1 ; > FLAG SET =3767 C3 RET = ; = ;********************************************************************** =  ; IF INPUT ERROR =378F 8B0C MOV CX,[SI] =3791 83F901 CMP CX,1 =3794 7411 37A7 JE ESCOFF010 ; IF DISABLE SYSTEM STATUS DISP. =3796 83F902 CMP  =3727 8A36DB64 MOV DH,LA =372B 8A16DC64 MOV DL,CA =372F 81FA0019 CMP DX,1900H ; IF CURSOR IS OUT OF SCREEN (LA=25,CA=00) =3733 742A 375F JE ESCELRET ; THE ; CHESK ESC RESET MODE * = ;********************************************************************** = ESCCHKL: =3768 803E5E6100 CMP MINFLG,0   CX,2 =3799 7411 37AC JE ESCOFF020 ; IF DISABLE KEY CLICK =379B 83F905 CMP CX,5 =379E 7411 37B1 JE ESCOFF030 ; IF DISABLE CURSOR DISPLAY =37A0 83F907  CMP CX,2 =37D7 7411 37EA JE ESCON020 ; IF ENABLE KEY CLICK =37D9 83F905 CMP CX,5 =37DC 7411 37EF JE ESCON030 ; IF ENABLE CURSOR DISPLAY =37DE * = ;********************************************************************** = CLICKON: =380B C6065F6101 MOV CLICKFLG,1 =3810 C3 RET =  CMP CX,7 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 77 =37A3 7411 37B6 JE ESCOFF040 ; IF DISABLE KEY BOARD INPUT =37A5 EB12  83F907 CMP CX,7 =37E1 7411 37F4 JE ESCON040 ; IF ENABLE KEY BOARD INPUT =37E3 EB12 37F7 JMPS ESCON050 = ; = ESCON010: =37E5 E817 ; = CLICKOFF: =3811 C6065F6100 MOV CLICKFLG,0 =3816 C3 RET = ; = ;********************************************************* 37B9 JMPS ESCOFF050 = ; = ESCOFF010: =37A7 E85B00 3805 CALL SYSDSPOFF ; DISABLE SYSTEM STATUS DISPLAY =37AA EB0D 37B9 JMPS ESCOFF050 = 00 37FF CALL SYSDSPON ; ENABLE SYSTEM STATUS DSPLAY =37E8 EB0D 37F7 JMPS ESCON050 = ; = ESCON020: =37EA E81E00 380B CALL CLICKON ************* = ;* ENABLE/DISABLE CURSOR DISPLAY * = ;********************************************************************** = 4092 CSRON EQU 4092H  ESCOFF020: =37AC E86200 3811 CALL CLICKOFF ; DISABLE KEY CLICK =37AF EB08 37B9 JMPS ESCOFF050 = ; = ESCOFF030: =37B1 E86E00 3822  ; ENABLE KEY CLICK =37ED EB08 37F7 JMPS ESCON050 = ; = ESCON030: =37EF E82500 3817 CALL CURSORON ; ENABLE CURSOR DISPLAY =37F2 EB03 37F7  ; CURSOR DISP ON = 4012 CSROFF EQU 4012H ; OFF = CURSORON: =3817 2EC706CE3B92 MOV CRTDSP,CSRON 40 =381E E89603 3BB7 CALL  CALL CURSOROFF ; DISABLE CURSOR DISPLAY =37B4 EB03 37B9 JMPS ESCOFF050 = ; = ESCOFF040: =37B6 E87A00 3833 CALL KEYINOFF ; DISABLE KEY  JMPS ESCON050 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 78 = ; = ESCON040: =37F4 E83600 382D CALL KEYINON  KBCSRD ; CURSOR DISP CMD OUT =3821 C3 RET = CURSOROFF: =3822 2EC706CE3B12 MOV CRTDSP,CSROFF 40 =3829 E88B03 3BB7 CALL KBCSRD ; CURSBOARD INPUT = ; = ESCOFF050: =37B9 595E POP CX ! POP SI = ESCOFF060: =37BB C6065E6100 MOV MINFLG,0 =37C0 C3 RET =  ; ENABLE KEY BOARD INPUT = ; = ESCON050: =37F7 595E POP CX ! POP SI =37F9 C6065E6100 MOV MINFLG,0 =37FE C3 RET = OR DISP CMD OUT =382C C3 RET = ; = ;********************************************************************** = ;* ENABLE/DISABLE KEY BOARD INPUT  ; = ;********************************************************************** = ;* ESCON * = ;***************** ; = ;********************************************************************** = ;* ENABLE/DISABLE SYSTEM STATUS DISPLAY * = ;*************************** * = ;********************************************************************** = KEYINON: =382D C606606100 MOV SYSKEYINFLG,0 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized B***************************************************** =37C1 5651 ESCON: PUSH SI ! PUSH CX =37C3 BE6861 MOV SI,OFFSET ANSIPRMTBL =37C6 803E676101 CMP ANSINOP,1 =37CB 752A 37F7 JNE ******************************************* = SYSDSPON: =37FF C606616100 MOV SYSDSPFLG,0 =3804 C3 RET = ; = SYSDSPOFF: =3805 C606616101 asic I/O System V1 PAGE 79 =3832 C3 RET = ; = KEYINOFF: =3833 C606606101 MOV SYSKEYINFLG,1 =3838 C3  ESCON050 ; IF INPUT ERROR =37CD 8B0C MOV CX,[SI] =37CF 83F901 CMP CX,1 =37D2 7411 37E5 JE ESCON010 ; IF ENABLE SYSTEM STATUS DSP. =37D4 83F902  MOV SYSDSPFLG,1 =380A C3 RET = ; = ;********************************************************************** = ;* ENABLE/DISABLE KEY CLICK   RET = ;************************************************************************ = ;* SCREEN DUMP * = ;* ESC 80H 00 CALL KBLCCV =3885 E8C602 3B4E CALL KBCSRO ; OUTPUT CURSOR AT CURENT SCREEN ADDR. = SDMPRET: =3888 C3 RET = CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized BasCH,6DH,6EH,6FH 666768696A6B 6C6D6E6F =61F1 707172737475 DB 70H,71H,72H,73H,74H,75H,76H,77H,78H,79H,7AH,7BH,7CH,7DH,7EH,7FH 767778797A7B 7C7D7E7F = = ;-----------------------------------H ; CHARACTER DUMP * = ;* ESC 80H 01H ; GRAPH CRT DUMP * = ;* ESC 80H 02H ; GRAPH MEMORY DUMP * = ic I/O System V1 PAGE 80 = EJECT = DSEG $ = 000A ANSIPRMTBLSZ EQU 10 = ; =6167 00 ------------------------------------- = ;********************************************************************** = ;* ATTRIBUTE TABLE * =  ;************************************************************************ = ESCSDMP: =3839 803ECC6203 CMP ESCMODE,3 =383E 7511 3851 JNE ESCSDMPRET =3840 BBA462 ANSINOP DB 0 =6168 ANSIPRMTBL RW ANSIPRMTBLSZ =617C 00 ATTRIBWK DB 0 =617D 00 ATTRIBS DB 0 = ;--------------- *R1.107 '83 4/27 --------------------------------------- ;********************************************************************** = ; GDC PARAM. INPUT PARAM. =6201 00 ATTRTBL DB 00H ; ATTRIBUTE 0 DEFAULT =6202 00  MOV BX,OFFSET ESCBUFF =3843 8A4701 MOV AL,1[BX] =3846 BE9662 MOV SI,OFFSET ESCSDMPPRM =3849 E802FB 334E CALL LOOKUP =384C FFD3 CALL BX =384E E8E8FB 343 = ;************************************************************************ = ;* UNIVERSAL CG TABLE * = ;******************************* DB 00H ; 1 DEFAULT =6203 04 DB 04H ; 2 V LINE =6204 02 DB 02H ; 3 O LINE =6205 01 DB 01H 9 CALL ESCRESET = ESCSDMPRET: =3851 C3 RET = = SDMP00: =3852 B100 MOV CL,0 ; CHRACTER DUMP =3854 EB06 385C JMPS ***************************************** = 617E U EQU OFFSET $ = 6180 U1 EQU (U AND 0FFFEH)+2 = ORG U1 =6180 00 U_AUXCGTBL DB 0 ; TAB ; 4 U LINE CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 81 =6206 08 DB 08H ; 5 BLINK =6207 00  SDMP03 = SDMP01: =3856 B101 MOV CL,1 ; CRT GRAPH DUMP =3858 EB02 385C JMPS SDMP03 = SDMP02: =385A B102 MOV CL,2 LE LENGTH = 6181 UCGOFF EQU OFFSET $ ; UNIVERSAL CG TABLE =6181 000102030405 DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH 060708090A0B 0C0D0E0F =6191 101112131415  DB 0 ; 6 NOT USED =6208 10 DB 10H ; 7 REVERSE =6209 000000000000 DB 0,0,0,0,0,0,0,0 ; 8...15 NOT USED 0000 =6211 00  ; GRAPH MEMORY DUMP = SDMP03: =385C 803E856000 CMP GDCBUSYF,0 ; GDC BUSY ? =3861 7525 3888 JNZ SDMPRET ; BUSY =3863 803E6E6600 CMP  DB 10H,11H,12H,13H,14H,15H,16H,17H,18H,19H,1AH,1BH,1CH,1DH,1EH,1FH 161718191A1B 1C1D1E1F =61A1 202122232425 DB 20H,21H,22H,23H,24H,25H,26H,27H,28H,29H,2AH,2BH,2CH,2DH,2EH,2FH 262728292A2B 2C2D2E2F  DB 00H ; 16 SECRET =6212 20 DB 20H ; 17 RED =6213 40 DB 40H ; 18 BLUE =6214 60 DB  DMAXFLG,0 ; DMAXFER EXECUTE ? =3868 751E 3888 JNZ SDMPRET ; EXECUTE =386A C606856001 MOV GDCBUSYF,1 =386F 1E06 PUSH DS ! PUSH ES =3871 CDDD =61B1 303132333435 DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,3AH,3BH,3CH,3DH,3EH,3FH 363738393A3B 3C3D3E3F =61C1 404142434445 DB 40H,41H,42H,43H,44H,45H,46H,47H,48H,49H,4AH,4BH,4CH,4DH,4EH,4FH 4647 60H ; 19 PURPLE =6215 80 DB 80H ; 20 GREEN =6216 A0 DB 0A0H ; 21 YELLOW =6217 C0 DB 0C0H  INT INTSDP =3873 071F POP ES ! POP DS =3875 C606856000 MOV GDCBUSYF,0 =387A 8A16DC64 MOV DL,CA =387E 8A36DB64 MOV DH,LA =3882 E87102 3AF648494A4B 4C4D4E4F =61D1 505152535455 DB 50H,51H,52H,53H,54H,55H,56H,57H,58H,59H,5AH,5BH,5CH,5DH,5EH,5FH 565758595A5B 5C5D5E5F =61E1 606162636465 DB 60H,61H,62H,63H,64H,65H,66H,67H,68H,69H,6AH,6BH,6  ; 22 LIGHT BLUE =6218 E0 DB 0E0H ; 23 WHITE =6219 000000000000 DB 0,0,0,0,0,0 ; 24...29 NOT USED * --'83 06/29-- =621F 00 DB 0 DB 1BH ; ESC ESC MODE SET =623D A633 DW ESCRTN =623F 1E DB 1EH ; RS CURSOR HOME =6240 0C39 DW HOMERTN =6242 00 PARAMETERS (DEC VT100 MODE) * = ;********************************************************************** =6257 41 ESCANSITBL DB 'A' ; CURSOR UP =6258 7635 DW 0H ; 30 SECRET * =6220 20 DB 20H ; 31 RED * =6221 80 DB 80H ; 32 GREEN * =6222 A0  DB 0 ; STOPPER =6243 1F39 DW DATARTN ; GRAFIC CODES CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 83 =  ESCCUU =625A 42 DB 'B' ; CURSOR DOWN =625B 9435 DW ESCCUD =625D 43 DB 'C' ; CURSOR FORWARD =625E B235 DW ESCCUF =6260  DB 0A0H ; 33 YELLOW * =6223 40 DB 40H ; 34 BLUE * =6224 60 DB 60H ; 35 PURPLE * =6225 C EJECT = ;********************************************************************** = ;* ESC TABLE 1 FIRST CHARACTER FOLLOWING "ESC", * = ;* 44 DB 'D' ; CURSOR BACKWARD =6261 D035 DW ESCCUB =6263 4A DB 'J' ; ERASE IN DISPLAY =6264 2B36 DW ESCED =6266 4B 0 DB 0C0H ; 36 LIGHT BLUE * =6226 E0 DB 0E0H ; 37 WHITE * = CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1  AND RELATED ROUTINE * = ;********************************************************************** =6245 5B ESCTBL1 DB '[' ; CONTROL SEQUENCE INTRODUCER =6246 6634  DB 'K' ; ERASE IN LINE =6267 1737 DW ESCEL =6269 4F DB 'O' ; INSERT CHARACTER =626A 6137 DW ESCIC =626C 50  PAGE 82 = EJECT = ;********************************************************************** = ;* ASCII CONTROL CODE TABLE  DW ESCANSI =6248 28 DB '(' ; ALTERNATE CHARACTER MODE SET/RESET =6249 E933 DW ESCALTCHR =624B 3D DB '=' ; CURSOR POSITION  DB 'P' ; DELETE CHARACTER =626D 6137 DW ESCDC =626F 6D DB 'm' =6270 0C35 DW ESCSGR =6272 4D DB 'M' ; =6273 0C35 * = ;********************************************************************** =6227 07 CNTTBL DB 07H ; BEL BELL =6228 6033 DW BELRTN =622A 08 =624C AC33 DW ESCCUP1 = ;---------------*R1.132 '83 2/17 -------------------------------------- =624E 01 DB 01H ; ATTRIBUTE SET =624F 2434 DW  DW ESCSGR =6275 3E DB '>' ; =6276 6237 DW ESCMIN =6278 6C DB 'l' ; ESC RESET MODE =6279 6837 DW  DB 08H ; BS CURSOR BACKWARD =622B E338 DW BSRTN =622D 0A DB 0AH ; LF CURSOR DOWN =622E A538 DW LFRTN =6230 0B  ESCATT = ;---------------*R1.107 '83 4/13 -------------------------------------- =6251 80 DB 80H ; SCREEN DUMP INTERFACE =6252 3938 DW ESCSDMP ; =  ESCCHKL =627B 4C DB 'L' ; ESC RESET MODE / =627C 6837 DW ESCCHKL = ; *** RMG / NECIS *** 9-1-83 *** add 'f' in following line =627E 66  DB 0BH ; VT CURSOR UP =6231 8938 DW VURRTN =6233 0C DB 0CH ; FF CURSOR FORWARD =6234 B738 DW FFRTN =6236 0D  ;---------------------------------------------------------------------- =6254 00 DB 0 ; STOPPER =6255 3934 DW ESCRESET CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized DB 'f' ; *** RMG / NECIS *** 9-8-83 =627F 7337 DW ESCCHKH ; *** RMG / NECIS *** 9-8-83 =6281 68 DB 'h' ; ESC SET MODE / CURSOR POSITION =6282 7337  DB 0DH ; CR CURSOR TO LEFT MARGIN =6237 0439 DW CRRTN =6239 1A DB 1AH ; SUB CLEAR SCREEN =623A 1939 DW CLRRTN =623C 1B Basic I/O System V1 PAGE 84 = EJECT = ;********************************************************************** = ;* ESC ANSI MODE   DW ESCCHKH =6284 48 DB 'H' ; ESC SET MODE / CURSOR POSITON =6285 7337 DW ESCCHKH =6287 00 DB 0 ; STOPPER =6288 3934  ;********************************************************************** = ;* DATA AREA FOR ESC SEQUENCE PROCESS = ;********************************************************************** = 001PLINE-1 =38AA 7205 38B1 JB LFRTN010 ; IF LA=NOT END LINE =38AC E82501 39D4 CALL ROLLUP ; ROLL UP =38AF EBE3 3894 JMPS CSWRT ; GDC CURSOR WRITE =  DW ESCRESET CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 85 = EJECT = ;*********************************************4 ESCBUFFSZ EQU 20 =62A2 A462 ESCPTR DW OFFSET ESCBUFF ; POINTER FOR ESC BUFFER =62A4 ESCBUFF RW ESCBUFFSZ = ; =62CC 00 ESCMODE DB 0 ; LFRTN010: =38B1 FE06DB64 INC LA =38B5 EBDD 3894 JMPS CSWRT ; GDC CURSOR WRITE = ;******************************************* = ;* CURSOR POSITION HORIZONT************************* = ;* ESC ALTERNATE CHARCTER PARAMETER * = ;********************************************************************** =628A 31 ESCALTPRM DCALLING COUNTER IN ESC MODE =62CD 0000 ESCWTG DW 0 ; WTG WHERE TO GO = ; =62CF 20 LCOFFSET DB 20H =62D0 00 ESCEDCASE DB 0 ; CASE FOR ESC SCREEN CLAL RIGHT * = ;******************************************* = FFRTN: =38B7 FE06DC64 INC CA ; COLUMN ADDRESS COUNT UP =38BB 803EDB6419 CMP LA,DPLINE B '1' =628B 0234 DW ESCALTSET = ;---------------*R1.107 '83 4/13 -------------------------------------- =628D 30 DB '0' ; ALTERNATE SET (CONTINUE) =628E 0A34 EAR =62D1 0000 ESCEDSL1 DW 0 ; DISPLAY LENGTH (<-- KBSL1) =62D3 0000 ESCEDSL2 DW 0 ; " (<-- KBSL2) CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1  ; CHECK IF CURSOR IS OUT OF SCREEN =38C0 7417 38D9 JE FFRTN010 =38C2 803EDC6450 CMP CA,COLUMN ; CHECK IF CURSOR IS OUT OF SCREEN =38C7 7217 38E0 JB FFRTN020 =38C9 C606DC6400  DW ESCALTSET00 =6290 42 DB 'B' ; ALTERNATE RESET =6291 1734 DW ESCALTRESET = ;---------------------------------------------------------------- PAGE 86 = EJECT = CSEG $ = ;******************************************* = ;* CURSOR POSITION VERTICAL UP  MOV CA,00H =38CE FE06DB64 INC LA ; COLUMN ADDRESS COUNT UP =38D2 803EDB6419 CMP LA,DPLINE =38D7 7207 38E0 JB FFRTN020 = FFRTN010: =38D9 E8F800 ------ =6293 00 DB 0 =6294 AB33 DW ESCNULL = = ;************************************************************************ = ;* ESC SCREEN DUMP PA * = ;******************************************* = VURRTN: =3889 803EDB6400 CMP LA,00H =388E 7414 38A4 JE VURRTNRET ; IF LA=FIRST LINE =3890 FE0E 39D4 CALL ROLLUP ; ROLL UP SCREEN =38DC FE0EDB64 DEC LA ; = FFRTN020: =38E0 E9B1FF 3894 JMP CSWRT ; GDC CURSOR WRITE = ;*RAMETER * = ;************************************************************************ =6296 30 ESCSDMPPRM DB '0' ; CHARACTER DUMP =6297 5238 DB64 DEC LA = CSWRT: =3894 50 PUSH AX =3895 8A36DB64 MOV DH,LA =3899 8A16DC64 MOV DL,CA =389D E85602 3AF6 CALL KBLCCV ****************************************** = ;* CURSOR POSITON HORIZONTAL LEFT * = ;******************************************* = BSRTN: =38E3 803EDC6400 CMP  DW SDMP00 =6299 31 DB '1' ; CRT GRAPH DUMP =629A 5638 DW SDMP01 =629C 32 DB '2' ; GRAPH MEMORY DUMP =629D 5A38  ; TO SCREEN MEMORY ADDR =38A0 E8AB02 3B4E CALL KBCSRO ; CURSOR POSIT. OUTPUT =38A3 58 POP AX = VURRTNRET: =38A4 C3 RET = ;*****CA,00H CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 87 =38E8 7406 38F0 JE BSRTN010 ; IF FIRST OF COLUMN =38EA FE0EDC64 DEC CA =3 DW SDMP02 =629F 00 DB 0 =62A0 AB33 DW ESCNULL = ;-------------------------------------------------------------------------- = = ************************************** = ;* CURSOR LINE FEED * = ;******************************************* = LFRTN: =38A5 803EDB6418 CMP LA,D 8EE EB10 3900 JMPS BSRTN020 = BSRTN010: =38F0 803EDB6400 CMP LA,00H =38F5 740C 3903 JE BSRTN030 ; IF FIRST OF LINE =38F7 FE0EDB64 DEC LA =38FB ; = LACAUP: =3924 803EDB6419 CMP LA,DPLINE ; CHECK IF CURSOR POSITON IS (LA=25,CA=0) =3929 7416 3941 JE LACA010 =392B FE06DC64 INC CA ; COLUMN AD5/14 = ;********************************************************************** = ;* DATA LOW-BYTE OUTPUT * = ;* INPUT AL ; DAT C606DC644F MOV CA,COLUMN-1 = BSRTN020: =3900 E991FF 3894 JMP CSWRT ; GDC CURSOR WRITE = BSRTN030: =3903 C3 RET = DRESS COUNT UP =392F 803EDC6450 CMP CA,COLUMN ; CHECK IF CURSOR IS OUT OF SCREEN =3934 7216 394C JB LACA020 =3936 C606DC6400 MOV CA,00H =393B FE06DB64 INC LA A CODE * = ;* LA,CA POINT TO NEXT POSITION * = ;********************************************************************** = ;******************************************* = ;* CHARRIAGE RETURN * = ;******************************************* =3904 C606DC6400 CRRTN: MOV CA,00H ; FIRST OF COL ; LINE ADDRESS COUNT UP =393F EB0B 394C JMPS LACA020 = LACA010: CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 88 =3941 E89000  CSEG $ = KBDTLO2: =396E 2EA27A39 MOV DATABYT,AL =3972 E81E02 3B93 CALL KBMOUT ; MULTI COMMAND OUTPUT =3975 03 DB 03H =3976 2042 UMN ADDR =3909 E988FF 3894 JMP CSWRT ; GDC CURSOR WRITE = ;******************************************* = ;* HOME * = ;****39D4 CALL ROLLUP ; ROLL UP SCREEN =3944 FE06DC64 INC CA =3948 FE0EDB64 DEC LA = LACA020: = = ;------- *R1.107 '83 05/08 ------------------------- DW 4220H ; CODEW COMMAND OUTPUT =3978 00 ALTRBYT DB 00H =3979 40 DB 40H =397A 00 DATABYT DB 00H =397B 40 DB 40H = *************************************** = HOMERTN: =390C C606DB6400 MOV LA,00H ; FIRST OF LINE ADDR =3911 C606DC6400 MOV CA,00H ; FIRST OF COLUMN ADDR =3916 E97BFF 3894------------------- = ; = ; CHACK AND CONVERT UNIVERSAL CG ROUTINE = ; = CNVUCG: =394C 3A068061 CMP AL,U_AUXC ;--------------- *R1.107 07/21/'83 ---------------------------------- =397C 2E802686258E AND ALTRBYTFLG,8EH ; =3982 2EC606783900 MOV ALTRBYT,0 = ;------------------------------------------------ JMP CSWRT ; GDC CURSOR WRITE = ;******************************************* = ;* CRT ALL CLEAR * = ;*************************************GTBL =3950 771C 396E JA CNVUCG_002 ; IF NOT CONVERT TO UNIVERSAL CG =3952 2EF606862587 TEST ALTRBYTFLG,87H =3958 7514 396E JNZ CNVUCG_002 ; IF BDOS OR BIOS ERROR MESSAGE = ----------- =3988 E8C902 3C54 CALL KBCSAD ; GET NEXT SCREEN ADDRESS =398B 8BD0 MOV DX,AX ; =398D 3DF00F CMP AX,COLUMN*51 ; IF OVER VIDEO MEMORY FOR DATA =3990 7209 ****** = CLRRTN: =3919 50 PUSH AX =391A E8B802 3BD5 CALL CRTCLR ; CRT CLEAR CALL =391D 58 POP AX =391E C3 RET =  ; OR ALTERNATE CHRA. OUTPUT =395A B700 MOV BH,0 =395C 8AD8 MOV BL,AL ; =395E 3A878161 CMP AL,UCGOFF[BX] =3962 740A 3 399B JB KBDTLO10 ; =3992 B85000 MOV AX,STLINE ;; LA CA IS ALREADY INCREMENTED =3995 E8B601 3B4E CALL KBCSRO ; =3998 BAF00F MOV DX,COLUMN*51 ; SE ;******************************************* = ;* GENERAL DATA * = ;******************************************* = DATARTN: =391F C606856001 96E JE CNVUCG_002 ; IF NOTHING CONVERT CG CODE =3964 8A878161 MOV AL,UCGOFF[BX] =3968 2EC606783989 MOV ALTRBYT,89H ; = CNVUCG_002: = ;--------------T THE LAST SCREEN ADDRESS = KBDTLO10: =399B 50 PUSH AX ; SAVE NEXT CURSOR POSITION =399C 4A DEC DX ; = KBDTLO20: =399D 8BC2  MOV GDCBUSYF,1 ; GDC BUSY FLAG ON = = ;------- R1.107 '83 05/08 ----------------------------------------------- = ; = ; LINE ADDR , COLUMN ADDR CHECK = --------------------------------------------------------- = CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 89 = EJECT = ; '83 0  MOV AX,DX ; =399F 50 PUSH AX ; SAVE ATTRIBUTE ADDRESS = ;----------------------------------------------------------- = ; GET THE SPECIFIED ; =39CE C606856000 MOV GDCBUSYF,0 ; GDC BUSY FLAG OFF =39D3 C3 RET = DSEG $ =62D5 ATMAP RS 512 ; ATTRIBUTE MAP  MOV KBSL2,AX = ROL020: =3A07 8306E56450 ADD KBSAD1,LINE1 ; ADD ONE LINE TO KBSAD1 =3A0C B8B01D MOV AX,LINEMAX =3A0F 2B06EB64 SUB AX,KBSL2 =3A13 A3E764  ADDRESS IN ATMAP (ATTRIBUTE MAP) = ; INPUT AX = SCREEN ADDRESS = ; OUTPUT DI = SPECIFIED ADDRESS = ; DL = MASK (RELATIVE BIT) = = CSEG $ CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 91 = EJECT = ;************************* MOV KBSL1,AX = ROL030: =3A16 E85401 3B6D CALL KBSCRO ; SCROLL CMD. OUTPUT =3A19 803ED96400 CMP ROLDCNT,0 ; CHECK IF ROLL DOWN OCCURRED =3A1E 7406 3A KBDTLO30: =39A0 E81303 3CB6 CALL GENATBIT =39A3 58 POP AX ; RESTORE ATTRIBUTE ADDRESS =39A4 050010 ADD AX,1000H =39A7 59 POP CX =****************** = ;* ROLL-UP * = ;******************************************* = ROLLUP: = 0050 COLUMN EQU 80 = 0019 26 JE ROL035 ; NO =3A20 FE0ED964 DEC ROLDCNT =3A24 EB31 3A57 JMPS ROL070 = ROL035: =3A26 803ED96400 CMP ROLDCNT,0 =3A2B 7505 3A32  ; = ; CHECK IF ATTRIBUTE IS DEFAULT OR NOT =39A8 2E803EC53980 CMP ATTRIB,80H =39AE 750A 39BA JNE KBDTLO60 = KBDTLO40: = ;  DPLINE EQU 25 ; DISPLAIED LINE = 0820 HFLINE EQU 26*COLUMN = 0FA0 ENDLINE EQU 50*COLUMN = 0050 LINE1 EQU COLUMN = 0130 LINESIZE EQU 19*16 = 1DB0  JNE ROL036 ; =3A2D C6066F6600 MOV FLAGX,0 ; = ROL036: =3A32 B618 MOV DH,DPLINE-1 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 ATTRIBUTE REQUESTED IS DEFAULT VALUE CHECK OLD ATTRIBUTE BIT =39B0 8415 TEST [DI],DL =39B2 741A 39CE JZ KBDTLO80 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1  LINEMAX EQU DPLINE*LINESIZE = 0050 STLINE EQU COLUMN = =39D4 50 PUSH AX =39D5 51 PUSH CX =39D6 A1E564 MOV AX,KBSAD1 =39D9 3DA00F  PAGE 92 =3A34 B200 MOV DL,0 =3A36 E8BD00 3AF6 CALL KBLCCV =3A39 B95000 MOV CX,COLUMN =3A3C 49 DEC CX =3A3D E8E701 3 PAGE 90 =39B4 F6D2 NOT DL =39B6 2015 AND [DI],DL ; ATTRIBUTE BIT OFF =39B8 EB02 39BC JMPS KBDTLO70 ; JUMP TO WRITE ATTRIBUTE =  CMP AX,ENDLINE ; KBSAD1 = END LINE ? =39DC 7413 39F1 JE ROL005 ; INITIALIZE SCREEN ADDRESS =39DE 3D2008 CMP AX,HFLINE ; KBSAD1 = HALF LINE OF VRAM? =39E1 7D10 39F3 C27 CALL KBCRTC0 = ROL060: =3A40 A1D764 MOV AX,LINESAVE =3A43 A3D564 MOV LINELAST,AX = =3A46 803EDA6400 CMP ROLDSTOP,0 =3A4B 750A 3A57 J KBDTLO60: = ; = ; ATTRIBUTE REQUESTED IS NOT DEFAULT ,THEN SET ATTRIBUTE BIT ON =39BA 0815 OR [DI],DL = KBDTLO70: =39BC E88F01 3B4E CALL KBC JGE ROL010 =39E3 C706EB640000 MOV KBSL2,0 ; KBSAD1 < HALF LINE =39E9 05D007 ADD AX,DPLINE*COLUMN =39EC A3D764 MOV LINESAVE,AX =39EF EB16 3A07 JMPS ROL02NE ROL070 =3A4D 3DA00F CMP AX,ENDLINE ; FIRST ROLL DOWN TO VRAM? =3A50 7505 3A57 JNE ROL070 =3A52 C606DA6401 MOV ROLDSTOP,1 ; RESET FIRST ROLL DOWN FLAGE = SRO =39BF E8D101 3B93 CALL KBMOUT =39C2 03 DB 03H =39C3 2042 DW 4220H =39C5 80 ATTRIB DB 80H =39C6 40 DB 40H =39C7 00 0 =39F1 EB67 3A5A ROL005: JMPS ROLINIT = ROL010: =39F3 2D2008 SUB AX,HFLINE ; HALF LINE <= KBSAD1 =39F6 50 PUSH AX =39F7 055000 ADD AX,STLIN ROL070: =3A57 59 POP CX =3A58 58 POP AX =3A59 C3 RET ; RETURN = ROLINIT: =3A5A C706E5645000 MOV KBSAD1,COLUMN =3 DB 00H =39C8 40 DB 40H = ; RESTORE NEXT SCREEN ADDRESS =39C9 8BC1 MOV AX,CX =39CB E88001 3B4E CALL KBCSRO = KBDTLO80: =E =39FA A3D764 MOV LINESAVE,AX =39FD 58 POP AX =39FE 055000 ADD AX,LINE1 =3A01 E8E300 3AE7 CALL KBCHARCHG ; CONVERT CHAR TO LENGTH =3A04 A3EB64  A60 C706E764B01D MOV KBSL1,LINEMAX =3A66 C706E9645000 MOV KBSAD2,COLUMN =3A6C C706EB640000 MOV KBSL2,0 =3A72 EBA2 3A16 JMPS ROL030 = ;************************** AX,HFLINE+LINE1 =3ABB 7F08 3AC5 JG ROLD040 =3ABD C706EB640000 MOV KBSL2,0 ; KBSAD1 <= HFLINE + LINE1 =3AC3 EB09 3ACE JMPS ROLD050 = ROLD040: =3AC5 2D7008  ;* LA,CA TO SCREEN MEMORY ADDR CONVERT * = ;* INPUT : REGISTER DL = CA * = ;* DH = LA * = ;* RESULT : REGISTER***************** = ;* ROLL DOWN * = ;******************************************* = ROLLDOWN: =3A74 5053 PUSH AX ! PUSH BX =3A76 A1 SUB AX,HFLINE+LINE1 =3AC8 E81C00 3AE7 CALL KBCHARCHG =3ACB A3EB64 MOV KBSL2,AX = ROLD050: =3ACE 832EE56450 SUB KBSAD1,LINE1 =3AD3 B8B01D MOV  AX = SCREEN MEMORY * = ;* ADDRESS * CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 94 = ;**********E564 MOV AX,KBSAD1 =3A79 8B1ED564 MOV BX,LINELAST =3A7D 3D5000 CMP AX,STLINE =3A80 7507 3A89 JNE ROLD005 =3A82 803EDA6400 CMP ROLDSTOP,0 =3A87 74 AX,LINEMAX =3AD6 2B06EB64 SUB AX,KBSL2 =3ADA A3E764 MOV KBSL1,AX = ROLD060: =3ADD E88D00 3B6D CALL KBSCRO ; OUTPUT SCROLL CMD =3AE0 FE06D964 INC ************************************ = KBLCCV: =3AF6 A1E764 MOV AX,KBSL1 ; =3AF9 E83300 3B2F CALL SL1CHNG ; SL TO CHARACTER NO. =3AFC A3DF64 MOV KBWKSL,5B 3AE4 JE ROLDRET ; KBSAD1 = STLINE & = ; ROLDSTOP = 0 THEN THROUGH RETURN = ROLD005: =3A89 81FBA00F CMP BX,ENDLINE =3A8D 750 ROLDCNT = ROLDRET: =3AE4 5B POP BX =3AE5 58 POP AX =3AE6 C3 RET = DSEG $ =64D5 A00F LINELAST DW ENDAX ; =3AFF E81D00 3B1F CALL LACACHNG ; SCREEN RELATIVE ADDR =3B02 3B06DF64 CMP AX,KBWKSL ; =3B06 7C12 3B1A JL KBLCCV010 ; =3B08 813EDF64D007 CMP KBWKSL7 3A96 JNE ROLD010 =3A8F 3D5000 CMP AX,STLINE =3A92 7450 3AE4 JE ROLDRET ; LAST LINE=ENDLINE & = ; KBSAD1 = STLINE = LINE ; LAST WRITTEN LINE =64D7 0000 LINESAVE DW 0 ; TEMP LINE =64D9 00 ROLDCNT DB 0 ; ROLL DOWN COUNTER =64DA 00 ROLDSTOP DB 0 ; FIRST ROLL DOWN FLAG = ;***,2000 ; =3B0E 740A 3B1A JZ KBLCCV010 ; =3B10 2B06DF64 SUB AX,KBWKSL ; =3B14 0306E964 ADD AX,KBSAD2 ; =3B18 EB04 3B1E JMPS KBLCCV020 ; =  ; THEN THROUGH =3A94 EB22 3AB8 JMPS ROLD030 ; LAST LINE = END LINE & = ; KBSAD1 <> STLINE = = ROLD010: ****************************************** = ;* CHARACTER TO SCREEN LENGTH * = ;********************************************* = CSEG $ = K KBLCCV010: =3B1A 0306E564 ADD AX,KBSAD1 ; = KBLCCV020: =3B1E C3 RET ; RETURN = ;***************************************** =3A96 83C350 ADD BX,LINE1 =3A99 3BC3 CMP AX,BX =3A9B 7447 3AE4 JE ROLDRET ; IF LAST LINE THEN RETURN = ROLD020: =3A9D 833EE56450 CMP BCHARCHG: = ;-------------------- *R1.133 '83 03/18 -------------------- =3AE7 53 PUSH BX ; =3AE8 B350 MOV BL,COLUMN ; =3AEA F6F3 DIV B**** = ;* LA,CA TO SCREEN RELATIVE ADDRESS * = ;* INPUT DH ; LA * = ;* DL ; CA * = ;* KBSAD1,STLINE CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 93 =3AA2 7514 3AB8 JNE ROLD030 =3AA4 C706E564A00F MOV KBSAD1,ENDLINE ; KBL ; AX / COLUMN =3AEC 8BD8 MOV BX,AX ; =3AEE D1E3 SHL BX,1 ; =3AF0 8B874565 MOV AX,TBL_LIN[BX] ; LINE SIZE TABLE =3AF4 5B P OUTPUT AX ; SCREEN RELATIVE * = ;* ADDRESS * = ;********************************************* = LACACHNG: = ;--------------SAD1=STLINE =3AAA C706E7643001 MOV KBSL1,LINESIZE =3AB0 C706EB64801C MOV KBSL2,LINESIZE*(DPLINE-1) =3AB6 EB25 3ADD JMPS ROLD060 = ROLD030: =3AB8 3D7008 CMP OP BX ; = ;----------------------------------------------------------- =3AF5 C3 RET ; = ;********************************************** =  ------ *R1.133 '83 03/18 -------------------- =3B1F 53 PUSH BX ; =3B20 BB0000 MOV BX,0 ; =3B23 86DE XCHG BL,DH ; =3B25 D1E3  ;* INPUT AX ; SCREEN ADDR * = ;******************************************** = KBCSRO: = ;-------------------- *R1.133 '83 03/12 -------------------- =3B4E 50 3B77 74FA 3B73 JZ BSC00 ; IF NOT EMPTY =3B79 B070 MOV AL,70H =3B7B E642 OUT 42H,AL ; SCROL COMMAND WRITE = ;-------- *R1.107 '83 05/10 ------SHL BX,1 ; =3B27 8B871165 MOV AX,TBL_CLM[BX] ; COLUMN TABLE =3B2B 03C2 ADD AX,DX ; (LA*50H) + CA =3B2D 5B POP BX ; = ; PUSH AX ; =3B4F 50 PUSH AX ; =3B50 C606856001 MOV GDCBUSYF,1 ; GDC BUSY FLAG ON = KBCSRO1: =3B55 E440 IN ------------------------- =3B7D BEE164 MOV SI,OFFSET KBSAD0 =3B80 B90800 MOV CX,008H = BSC010: =3B83 AD LODS WORD PTR SI =3B84 E640 OUT ----------------------------------------------------------- =3B2E C3 RET ; RETURN = ;********************************************* = ;* SL1 TO CHARACTER NO. CONVERT AL,40H ; GDC STATUS READ =3B57 A804 TEST AL,04H ; FIFO EMPTY (DB2) =3B59 74FA 3B55 JZ KBCSRO1 ; IF NOT EMPTY =3B5B B049 MOV AL,49H ; =3B5D E642 40H,AL =3B86 8AC4 MOV AL,AH CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 96 =3B88 E640 OUT 40H,AL ; WRITE PARAMETER * = ;* INPUT AX : SCREEN LENGTH * = ;* OUTPUT AX : CHARACTER NO. * = ;********************************************* = S OUT 42H,AL ; CURSOR WRITE COMMAND =3B5F 58 POP AX ; =3B60 E640 OUT 40H,AL ; SCREEN ADDRESS (LOW) =3B62 8AC4 MOV AL,AH  =3B8A E2F7 3B83 LOOP BSC010 =3B8C C606856000 MOV GDCBUSYF,0 ; GDC BUSY FLAG OFF =3B91 5E POP SI = ;----------------------------------------------------------- L1CHNG: = ;-------------------- *R1.133 '83 03/18 -------------------- =3B2F 53 PUSH BX ; =3B30 8BD8 MOV BX,AX ; =3B32 B80000 MOV AX, ; =3B64 E640 OUT 40H,AL ; SCREEN ADDRESS (HIGH) =3B66 C606856000 MOV GDCBUSYF,0 ; GDC BUSY FLAG OFF =3B6B 58 POP AX ; = ;-- =3B92 C3 RET ; RETURN = ;********************************************* = ;* MULTI COMMAND OUTPUT TO GDC * = ;********************0 ; =3B35 D1EB SHR BX,1 ; =3B37 D1EB SHR BX,1 ; =3B39 D1EB SHR BX,1 ; =3B3B 81FB6002 CMP BX,0260H ; =3B3--------------------------------------------------------- =3B6C C3 RET = ;******************************************** = ;* SCROLL COMMAND OUTPUT * = ************************* = KBMOUT: =3B93 5E POP SI =3B94 50 PUSH AX =3B95 51 PUSH CX =3B96 B500 MOV CH,0 ; R1.107F 7203 3B44 JB SL1CHNG1 ; =3B41 B80005 MOV AX,COLUMN*16 ; = SL1CHNG1: CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1  ;******************************************** = KBSCRO: =3B6D 56 PUSH SI ; *R1.107 '83 05/10 =3B6E C606856001 MOV GDCBUSYF,1 ; GDC BUSY FLAG ON =  '83 05/10 =3B98 8AF5 MOV DH,CH ; R1.107 '83 05/10 =3B9A 8A0C MOV CL,[SI] ; COMMAND COUNTER =3B9C C606856001 MOV GDCBUSYF,1 ; GDC BUSY FLAG ON =  PAGE 95 =3B44 81E31F00 AND BX,001FH ; =3B48 0387F164 ADD AX,TBL_SL1[BX] ; SL1 TABLE =3B4C 5B POP BX ; = ;--------------------------- BSC00: =3B73 E440 IN AL,40H ; GDC STATUS READ = ; *** NOTE *** = ; TEST AL,20H ; VERTICAL SYNC (DB5) = ; JZ BSC0 BMO000: =3BA1 E440 IN AL,40H ; GDC FIFO EMPTY CHECK =3BA3 A804 TEST AL,04H ; FIFO EMPTY (DB2) =3BA5 74FA 3BA1 JZ BMO000 ; IF NOT EMPTY =3BA7 46 ------------------------------- =3B4D C3 RET ; RETURN = ;******************************************** = ;* CURSOR POSITION OUTPUT * = 0 ; IF NOT READY = ; TEST AL,08H ; DRAWING (DB3) = ; JNZ BSC00 ; IF DRAWING NOW =3B75 A804 TEST AL,04H ; FIFO EMPTY (DB2) =  INC SI =3BA8 AD BMO010: LODS WORD PTR SI ; R1.107 '83 05/10 =3BA9 8AD4 MOV DL,AH ; I/O ADDR *R1.107 '83 05/10 =3BAB EE OUT DX,AL ;  DW COLUMN*14,COLUMN*9,COLUMN*4,COLUMN*15,COLUMN*10,COLUMN*5 B00420039001 = ; = 6511 TBL_CLM EQU OFFSET $ =6511 00005000A000 DW COLUMN*0,COLUMN*1,COLUMN*2,COLUMN*3,COLUMN*4  CSEG $ = KBCSRD: =3BB7 C606856001 MOV GDCBUSYF,1 ; GDC BUSY FLAG ON =3BBC 50 PUSH AX = KBCSRD1: CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized COMMAND WRITE =3BAC E2FA 3BA8 LOOP BMO010 =3BAE C606856000 MOV GDCBUSYF,0 ; GDC BUSY FLAG OFF =3BB3 59 POP CX =3BB4 58 POP AX =3BB5 FFE6  F0004001 =651B 9001E0013002 DW COLUMN*5,COLUMN*6,COLUMN*7,COLUMN*8,COLUMN*9 8002D002 =6525 20037003C003 DW COLUMN*10,COLUMN*11,COLUMN*12,COLUMN*13,COLUMN*14 10046004 =652F B00400055005 DBasic I/O System V1 PAGE 98 =3BBD E440 IN AL,40H ; GDC STATUS READ =3BBF A808 TEST AL,08H ; DRAWING (DB3) =3BC1 75FA 3BBD  JMP SI ; RETURN = ;********************************************* = ;* CONOUT USE AREA * = ;***************************************W COLUMN*15,COLUMN*16,COLUMN*17,COLUMN*18,COLUMN*19 A005F005 =6539 40069006E006 DW COLUMN*20,COLUMN*21,COLUMN*22,COLUMN*23,COLUMN*24 30078007 =6543 D007 DW COLUMN*25 = JNZ KBCSRD1 ; IF NOT READY =3BC3 A820 TEST AL,20H ; VERTICAL SYNC (DB5) =3BC5 74F6 3BBD JZ KBCSRD1 ; IF NOT READY =3BC7 58 POP AX =3BC8 E8C8FF ****** = DSEG $ =64DB 00 LA DB 00H ; LINE ADDR =64DC 00 CA DB 00H ; COLUMUN ADD =64DD 00 WKCA DB 00H ; WORK FO; = 6545 TBL_LIN EQU OFFSET $ =6545 000030016002 DW LINESIZE*0,LINESIZE*1,LINESIZE*2,LINESIZE*3,LINESIZE*4 9003C004 =654F F00520075008 DW LINESIZE*5,LINESIZE*6,LINESIZE*7,LINESIZE*8,LINESIZ3B93 CALL KBMOUT ; MULT CMD.OUTPUT =3BCB 04 DB 04H =3BCC 4B42 DW 424BH =3BCE 9240 CRTDSP DW 4092H =3BD0 0140 DW 4001H =3BD2 8A40 R CA =64DE 00 WKLA DB 00H ; WORK FOR LA = ;* =64DF 0000 KBWKSL DW 0000H = ;*** GDC MEMORY ADDR & LENGTH = ;* =64E1 0000 E*9 8009B00A =6559 E00B100D400E DW LINESIZE*10,LINESIZE*11,LINESIZE*12,LINESIZE*13,LINESIZE*14 700FA010 =6563 D01100133014 DW LINESIZE*15,LINESIZE*16,LINESIZE*17,LINESIZE*18,LINESIZE*19 60159016 = DW 408AH =3BD4 C3 RET = ;********************************************** = ;* CRT CLEAR CALL SUBROUTINE * = ;*************** KBSAD0 DW 0000H ; GDC ADDR 0 =64E3 3001 KBSL0 DW 1*LINESIZE ; GDC LENGTH 0 (STATUS LINE) =64E5 5000 KBSAD1 DW COLUMN ; GDC ADDR 1 =64E7 B01D KBSL1 DW LINEMAX 656D C017F018201A DW LINESIZE*20,LINESIZE*21,LINESIZE*22,LINESIZE*23,LINESIZE*24 501B801C =6577 B01DE01E1020 DW LINESIZE*25,LINESIZE*26,LINESIZE*27,LINESIZE*28,LINESIZE*29 40217022 =6581 A023D0240026 ******************************* = CRTCLR: = ; LOCAL CLEAR =3BD5 C606676101 MOV ANSINOP,1 =3BDA C70668610200 MOV ANSIPRMTBL,2 =3BE0 E848FA 362B CALL  ; GDC LENGTH 1 =64E9 5000 KBSAD2 DW COLUMN ; GDC ADDR 2 =64EB 0000 KBSL2 DW 0000H ; GDC LENGTH 2 =64ED 0000 KBSAD3 DW 0000H ; GDC ADDR 3 =64EF 0000  DW LINESIZE*30,LINESIZE*31,LINESIZE*32,LINESIZE*33,LINESIZE*34 30276028 =658B 9029C02AF02B DW LINESIZE*35,LINESIZE*36,LINESIZE*37,LINESIZE*38,LINESIZE*39 202D502E =6595 802FB030E031 DW LINESESCED =3BE3 E853F8 3439 CALL ESCRESET =3BE6 E9ABFC 3894 JMP CSWRT ; CURSOR WRITE = ;********************************************** = ;* CRT CLEAR  KBSL3 DW 0000H ; GDC LENGTH 3 = ;* = ; CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 97 = 64F1 TBL_IZE*40,LINESIZE*41,LINESIZE*42,LINESIZE*43,LINESIZE*44 10334034 =659F 7035A036D037 DW LINESIZE*45,LINESIZE*46,LINESIZE*47,LINESIZE*48,LINESIZE*49 0039303A =65A9 603B DW LINESIZE*50 =  * = ;* INPUT AX = SCREEN MEMORY ADDR * = ;* DL = ATTRITRIBUTE * = ;* DH = CLEAR CODE * = ;*SL1 EQU OFFSET $ =64F1 00007003E001 DW COLUMN*0,COLUMN*11,COLUMN*6,COLUMN*1,COLUMN*12 5000C003 =64FB 3002A0001004 DW COLUMN*7,COLUMN*2,COLUMN*13,COLUMN*8,COLUMN*3 8002F000 =6505 6004D0024001  ; = ;********************************************** = ;* CURSOR DISP * = ;********************************************** =   CX = CLEAR LENGTH FROM 0 * = ;********************************************** = KBCRTC: =3BE9 50 PUSH AX =3BEA 2EA20D3C MOV BCC010,AL =3BEE 2E IF CLEAR LENGTH IS ZERO =3C2A 7427 3C53 JE KBCRTC02 =3C2C 52 PUSH DX =3C2D 50 PUSH AX =3C2E BA0020 MOV DX,2000H =3C31 E8B5FF 3BE9 CALL KB TEST AL,04H ; GDC FIFO EMPTY (DB2) =3C5D 74FA 3C59 JZ BCA000 ; IF NOT EMPTY =3C5F B0E0 MOV AL,0E0H =3C61 E642 OUT 42H,AL ; CSRR CMD = 88260F3C MOV BCC020,AH =3BF3 2E880E1B3C MOV BCC030,CL =3BF8 2E882E1D3C MOV BCC040,CH =3BFD 2E8816213C MOV BCC050,DL =3C02 2E8836233C MOV BCC060,DH =3C07 E88CRTC =3C34 050010 ADD AX,1000H =3C37 BA8000 MOV DX,0080H =3C3A E8ACFF 3BE9 CALL KBCRTC =3C3D 58 POP AX =3C3E E80DFF 3B4E CALL KBCSRO =3C41 41  BCA010: =3C63 E440 IN AL,40H ; READ STATUS =3C65 D0E8 SHR AL,1 =3C67 73FA 3C63 JAE BCA010 ; GDC DATA NOT READY =3C69 E442 IN 9FF 3B93 CALL KBMOUT ; MULTI COM. OUTPUT =3C0A 0D DB 0DH =3C0B 4942 DW 4249H ; CSRW COM. OUTPUT =3C0D 00 BCC010 DB 00H =3C0E 40  INC CX = KBCRTC01: ; RESET ATTRIBUTE MAP = ;-------------------- *R1.133 '83 03/15 --------------------- =3C42 51 PUSH CX =3C43 E87000 AL,42H ; READ DATA =3C6B 8AE0 MOV AH,AL = BCA020: =3C6D E440 IN AL,40H ; READ STATUS =3C6F D0E8 SHR AL,1 =3C71 73FA 3C6D  DB 40H =3C0F 00 BCC020 DB 00H =3C10 40 DB 40H =3C11 4A42 DW 424AH =3C13 FF40 DW 40FFH =3C15 FF40 DW 40FFH =3 3CB6 CALL GENATBIT =3C46 F6D2 NOT DL =3C48 59 POP CX = KBCRTC015: =3C49 2015 AND [DI],DL ; ATTRIBUTE BIT RESET =3C4B D0C2  JAE BCA020 =3C73 E442 IN AL,42H =3C75 86E0 XCHG AH,AL =3C77 50 PUSH AX =3C78 B06B MOV AL,6BH ; DUMMY COMMAND =3C7A E642 C17 4C42 DW 424CH =3C19 0240 DW 4002H =3C1B 00 BCC030 DB 00H =3C1C 40 DB 40H CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1  ROL DL,1 =3C4D 7201 3C50 JB KBCRTC017 =3C4F 47 INC DI = KBCRTC017: =3C50 E2F7 3C49 LOOP KBCRTC015 = ;------------------ OUT 42H,AL =3C7C 58 POP AX =3C7D C606856000 MOV GDCBUSYF,0 ; GDC BUSY FLAG OFF =3C82 C3 RET = ;*********************************************** PAGE 99 =3C1D 00 BCC040 DB 00H =3C1E 40 DB 40H =3C1F 2042 DW 4220H =3C21 00 BCC050 DB 00H =3C22 40 ------------------------------------------ =3C52 5A POP DX = KBCRTC02: =3C53 C3 RET ; RETURN = ; = ;************************************** = ;* SCREEN MEMORY ADDRESS TO LA,CA CONVERSION * = ;* INPUT AX = SCREEN MEMORY ADDR * = ;*  DB 40H =3C23 00 BCC060 DB 00H =3C24 40 DB 40H =3C25 58 POP AX =3C26 C3 RET = ;********************************************************************************************** = ;* KBCSAD READ CURSOR ADDRESS * = ;* OUTPUT AX; CURSOR SCREEN MEMORY ADDRESS * =  OUTPUT DH = LA * = ;* DL = CA * = ;********************************************************************** =3******************************* = ;* KBCRTC0 CRT CLEAR WITH ATTRIBUTE AREA * = ;* AX = SCREEN MEMORY ADDRESS * = ;*  ;********************************************************************** = KBCSAD: =3C54 C606856001 MOV GDCBUSYF,1 ; GDC BUSY FLAG ON = BCA000: CP/M ASM86 1.1 SOURCC83 3D5000 KBSACV: CMP AX,CTLLINE =3C86 722B 3CB3 JB BSA020 ; IF CONTROL LINE =3C88 3B06E564 CMP AX,KBSAD1 =3C8C 7315 3CA3 JAE BSA010 =3C8E 50  CX = CLEAR LENGTH * = ;********************************************************************** = KBCRTC0: =3C27 83F9FF CMP CX,0FFFFH ;E: USCBIOS.A86 Customized Basic I/O System V1 PAGE 100 = ;*** GDC FIFO EMPTY CHECK **** =3C59 E440 IN AL,40H ; GDC STATUS READ =3C5B A804  PUSH AX =3C8F B8F00F MOV AX,LASTLINE+1 =3C92 8B0EE564 MOV CX,KBSAD1 =3C96 2BC1 SUB AX,CX =3C98 8BC8 MOV CX,AX =3C9A 58 POP AX -------------- =3CC3 B201 MOV DL,1 ; SET (DB0) ON =3CC5 D2E2 SHL DL,CL ; =3CC7 81C7D562 ADD DI,OFFSET ATMAP ; GENERATE ATTRIBUTE MASK BIT =3CCB C3  UNIVERSAL CG CODE CONVRT and SET * = ;********************************************* =3CDC 8AC1 MOV AL,CL =3CDE 2EF606862580 TEST ALTRBYTFLG,80H =3CE4 7520 3D06 JNZ=3C9B 2B06E964 SUB AX,KBSAD2 =3C9F 03C1 ADD AX,CX =3CA1 EB06 3CA9 JMPS BSA015 =3CA3 8B0EE564 BSA010: MOV CX,KBSAD1 =3CA7 2BC1 SUB AX,CX =3CA9 99  RET CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 102 = EJECT = INCLUDE USLIST.LIB =  U_CGEND ; IF BDOS OR BIOS ERROR MESSAGE =3CE6 2EF606862507 TEST ALTRBYTFLG,07H =3CEC 7403 3CF1 JZ LISTOUT10 ; =3CEE E9F000 3DE1 JMP DOT_PATTERN ; IF DOT MATRIX PATTERN =  BSA015: CWD =3CAA B150 MOV CL,50H ; *R1.133 '83 03/10 =3CAC F6F1 DIV CL ; *R1.133 '83 03/10 =3CAE 8AD4 MOV DL,AH  ;**** '83/08/01 **** = ;********************************************* = ;* * = ;* LISTOUT (LIST DEVICE OUTPUT) * =  LISTOUT10: =3CF1 3A0E8061 CMP CL,U_AUXCGTBL ; =3CF5 770F 3D06 JA U_CGEND ; IF NO UNIVERSAL CODE =3CF7 2AED SUB CH,CH ; CLEAR CH =3CF9 BE8161  ; DL = CA *R1.133 '83 03/10 =3CB0 8AF0 MOV DH,AL ; DH = LA =3CB2 C3 RET = ; CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1  ;* * = ;********************************************* = CSEG $ = LISTOUT: = ;******* THIS IS T MOV SI,OFFSET U_AUXCGTBL+1 ; UNIVERSAL CG CODE OFFSET =3CFC 03F1 ADD SI,CX =3CFE AC LODS BYTE PTR [SI] ; AL = UNIVERSAL CG CODE =3CFF 3AC1 CMP AL,CL  PAGE 101 =3CB3 2BD2 BSA020: SUB DX,DX ; DX = LA,CA (00) =3CB5 C3 RET = ; = 0050 CTLLINE EQU 0050H = 0FEF LASTLHE CODE ADDED FOR LINE PRINTER *********** = ;******* SWITCHING BETWEEN CENTRONIX (PARALLEL) AND ******** = ;******* SERIAL RS232-C PORT (STANDARD) BY I/O BYTE ******** = ;******* S ; =3D01 7403 3D06 JE U_CGEND ; IF ASCII DATA =3D03 E9DB00 3DE1 JMP DOT_PATTERN ; IF DOT PATTERN = U_CGEND: = ;--------------------------------------INE EQU 51*80-1 = ;******************************************************************* = ;* GENERATE ATTRIBUTE MASK BIT * = ;* INPUETTING. I/O BYTE = 80H --> CENTRONIX ******** = ;******* I/O BYTE = C0H --> SERIAL RS232-C ******* = ; = ;-------------------------------- R1.132 '83 2/22 -------------------------------------- =3D06 8AC1 MOV AL,CL =3D08 E84700 3D52 CALL EXCVO ; CODE CONVERT CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAT AX = SCREEN MEMORY ADDRESS * = ;******************************************************************* = ; = GENATBIT: = ;-------------------- *R1.132 ------- =3CCC 50 PUSH AX =3CCD 2EA08725 MOV AL,IOBYTE ; GET IOBYTE =3CD1 24C0 AND AL,0C0H ; MASK EXCEPT LIST FIELD =3CD3 3CC0 CMP AL,0C0H =3GE 103 = LOUT010: =3D0B E8F501 3F03 CALL LISTST ; LIST STATUS =3D0E 51 PUSH CX =3D0F B91001 MOV CX,0110H ; SET DELAY COUNT = '83 02/28 -------------------- =3CB6 8BC8 MOV CX,AX ; =3CB8 D1E8 SHR AX,1 ; (SCREEN MEMORY ADDRESS) / 8 =3CBA D1E8 SHR AX,1 ; =3CBC D1E8 CD5 58 POP AX =3CD6 7503 3CDB JNE LOUT005 =3CD8 E97D0A 4758 JMP PUNCH ; IF LIST FIELD IS UL1 = LOUT005: = ;-------------------------- DELAY_FOR_TEST: =3D12 51 PUSH CX ; DO DELAY IN MICRO SECONDS =3D13 59 POP CX =3D14 E2FC 3D12 LOOP DELAY_FOR_TEST =3D16 59 POP CX =3D17 E8E SHR AX,1 ; =3CBE 8BF8 MOV DI,AX ; AX = QUOTIENT =3CC0 80E107 AND CL,07H ; CL = REMINDER = ;------------------------------------------------------------------------------------------ =3CDB FC CLD = ;---------* NEW CODE '83/05/23 --------------- = ;********************************************* = ;*  901 3F03 CALL LISTST =3D1A 3CFF CMP AL,0FFH =3D1C 7419 3D37 JE LOUT015 ; IF NORMAL RETURN =3D1E BBAF69 MOV BX,OFFSET LSTRTYMSG =3D21 E8C50B 48E9 BL,7FH ; SO OR SI ? =3D5E 7641 3DA1 JBE SIADD ; IF SI THEN SI ADDRESS =3D60 80FBA0 CMP BL,OSIFT1 ; SIFT FREE ? (S) =3D63 7627 3D8C JBE DATADD2 CP/M ASM86 1.1 SOU MOV CL,WORKSI =3DAF 3A0EAD65 CMP CL,OLDFLG ; OLDFLAG = SI =3DB3 74D7 3D8C JZ DATADD2 ; IF OLDF = SI THEN DD1 =3DB5 880EAD65 MOV OLDFLG,CL ; WRITE SIDATA CALL PMSG ; LIST NOT READY MASSAGE =3D24 E8C0ED 2AE7 CALL CONIN ; ANY KEY-IN =3D27 3C52 CMP AL,'R' =3D29 74E0 3D0B JE LOUT010 ; RETRY =3D2B 3C72 RCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 104 =3D65 80FBE0 CMP BL,OSIFT2 ; SIFT FREE ? (G) =3D68 7D22 3D8C JGE DATADD2 =3D6A 8A0ED35C  --> OLDFLAG =3DB9 881EEB5D MOV SVDATA,BL ; SAVE BL DATA =3DBD 8AD9 MOV BL,CL =3DBF E8D3FF 3D95 CALL TBCOV ; SI => PARITY ROUTINE =3DC2 8ACB MOV CL, CMP AL,'r' =3D2D 74DC 3D0B JE LOUT010 ; RETRY =3D2F BBB624 MOV BX,CTLPFREE =3D32 C60700 MOV BYTE PTR[BX],0 =3D35 EB1A 3D51 JMPS LOUT020 =  MOV CL,WORKSO ; CL = SO DATA =3D6E 3A0EAD65 CMP CL,OLDFLG ; OLDFLAG = SO ? =3D72 7418 3D8C JZ DATADD2 ; IF '=' THEN ADD2 =3D74 880EAD65 MOV OLDFLG,CL ; WRIBL =3DC4 8A1EEB5D MOV BL,SVDATA ; SAVEDATA => BL =3DC8 B001 MOV AL,01H ; SET COUNT FLAG =3DCA A2AC65 MOV SISOF,AL ; COUNT FLAG --> SISOF =3DCD EBBD 3D LOUT015: =3D37 8AF9 MOV BH,CL ; SI-SO DATA --> BH =3D39 B001 MOV AL,01H =3D3B 8406AC65 TEST AL,SISOF ; AL = FLG ? =3D3F 740C 3D4D TE SODATA --->OLDFLG =3D78 881EAB65 MOV BLDATA,BL ; SAVE BL =3D7C 8AD9 MOV BL,CL ; LOAD BL,0EH =3D7E E81400 3D95 CALL TBCOV ; SO => PARITY ROUTINE =3D81 8ACB 8C JMPS DATADD2 = ; = ;**** ODD PARITY ROUTINE **** = ; =3DCF 0ADB PA01: OR BL,BL =3DD1 7BCD 3DA0 JNP ALRET ; BL = ODD =3JZ LOUT016 =3D41 8AC7 MOV AL,BH =3D43 E66A OUT SODAWD,AL ; WRITE SI-SO DATA =3D45 B700 MOV BH,00H =3D47 883EAC65 MOV SISOF,BH ; SISOFLG =  MOV CL,BL =3D83 8A1EAB65 MOV BL,BLDATA ; SAVEDATA => BL =3D87 B001 MOV AL,01H ; SI,SO INITIALIZE =3D89 A2AC65 MOV SISOF,AL = DD3 80F380 XOR BL,80H ; INSERT ODD PARITY =3DD6 EBC8 3DA0 JMPS ALRET = ; = ;**** EVEN PARITY ROUTINE **** = ; CP/M ASM86 1.1 SOURC00H =3D4B EBBE 3D0B JMPS LOUT010 = LOUT016: =3D4D 8AC3 MOV AL,BL =3D4F E66A OUT SODAWD,AL ; WRITE CONVERT DATA = ; = DATADD2: =3D8C B8D85C MOV AX,OFFSET SIDA1 ; 1ST SO ADDRESS POINT DATA =3D8F 2AFF CONVBL: SUB BH,BH ; BH = 0 =3D91 03D8 ADD BX,AX ; AX = CONVERT DATA ADDRESS =3D93 8A1FE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 105 =3DD8 0ADB PA02: OR BL,BL =3DDA 7AC4 3DA0 JPE ALRET ; BL = EVEN =3DDC 80F380 XOR  LOUT020: =3D51 C3 RET = ;********************************************* = ;* CODE CONVERT * = ;* INPUT AL ; ASC MOV BL,[BX] ; BL = CONVERT DATA =3D95 A0D25C TBCOV: MOV AL,TBLWORK ; USER APOINTED PARITY =3D98 3C81 CMP AL,81H =3D9A 7433 3DCF JZ PA01 ; IF  BL,80H ; INSERT EVEN PARITY =3DDF EBBF 3DA0 JMPS ALRET = ; = ;---------* NEW CODE '83,04/27 -------------- = ;********************************************* II * = ;* OUTPUT BL ; CONVERT CODE * = ;* CL ; SI-SO CVCODE * = ;********************************************* = EODD THEN PARITY-ODD =3D9C 3C82 CMP AL,82H =3D9E 7438 3DD8 JZ PA02 ; IF EVEN THEN PARITY-EVEN =3DA0 C3 ALRET: RET = ; = ; =3DA1 80FB20 = ;* DOT PATTERN OUT-PUT ROUTINE * = ;* PRINTER = 8023 & SKSP * = ;* INPUT * = ;* XCVO: =3D52 8AD8 MOV BL,AL =3D54 803ED25C80 CMP TBLWORK,80H ; USER APOINT = BL ? =3D59 7431 3D8C JE DATADD2 ; IF 80H THEN GOTO DATADD2 =3D5B 80FB7F CMP  SIADD: CMP BL,ISIFT1 ; SIFT FREE ? (S) =3DA4 76E6 3D8C JBE DATADD2 =3DA6 80FB60 CMP BL,ISIFT2 ; SIFT FREE ? (G) =3DA9 7DE1 3D8C JGE DATADD2 =3DAB 8A0ED45C   CL = INPUT CODE * = ;* AL = DOT PATTERN CODE * = ;********************************************* = DOT_PATTERN: =3DE1 2E803E862501 CMP A ; =3E20 BB5400 MOV BX,0054H ; CMOS PRINTER PATTERN DATA ADDRESS =3E23 268A07 MOV AL,ES:[BX] ; AL = PATTERN DATA CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1  PUSH ES =3E78 8CD8 MOV AX,DS =3E7A 8EC0 MOV ES,AX =3E7C F3A4 REP MOVS AL,AL =3E7E 07 POP ES = ; = LTRBYTFLG,01H =3DE7 7414 3DFD JE DOT_PTR00 ; IF ALT PATTERN 1CHR =3DE9 80F97F CMP CL,7FH ; SHIFT FREE CODE ANALAIZE =3DEC 7707 3DF5 JA SOADDRESS ; IF 7FH < CL =3DEE 8 PAGE 106 =3E26 07 POP ES =3E27 59 POP CX =3E28 3C04 CMP AL,04H =3E2A 741B 3E47 JE DOT_PTR04 ; IF 8023 8  ; Dot matrix main out routine = ; = MAIN_OUT: =3E7F B92600 MOV CX,OFFSET END_CODE - OFFSET CONTROL =3E82 BEB565 MOV SI,OFFSET CONTROL ; ST0F920 CMP CL,ISIFT1 ; 20H =3DF1 7207 3DFA JB DOT_PTR_NOT ; 1FH > CL =3DF3 EB08 3DFD JMPS DOT_PTR00 ; IF DOT DATA = SOADDRESS: =3DF5 80F9FE PIN DOT MATRIX =3E2C 3C01 CMP AL,01H =3E2E 7403 3E33 JE DOT_PTR02 ; IF SKSP 16 PIN DOT MATRIX =3E30 E9D3FE 3D06 JMP U_CGEND ; IF SPCE OUT PUT = DOART ADDRESS = MAIN_OUT10: =3E85 2BC02AFF SUB AX,AX !SUB BH,BH ; CLEAR AX & BH =3E89 A2AC65 MOV SISOF,AL ; CLERR PARITY FLAG =3E8C 890EB065 MOV  CMP CL,0FEH ; SHIFT FREE CODE =3DF8 7203 3DFD JB DOT_PTR00 ; IF NOT SHIFT CODE = DOT_PTR_NOT: =3DFA E909FF 3D06 JMP U_CGEND ; IF NOMAL DATA = T_PTR02: =3E33 C706AE650200 MOV TRNCNT,2 =3E39 BBE565 MOV BX,OFFSET TOP_CODE+7 =3E3C E8A300 3EE2 CALL TRANSFER =3E3F BBED65 MOV BX,OFFSET BOTTOM_CODE+7 =3E42 E89D00 SAVE_CX,CX =3E90 8936B265 MOV SAVE_SI,SI ; CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 107 =3E94 8A1C MOV BL,[SI]  DOT_PTR00: =3DFD 51 PUSH CX ; SAVE DATA =3DFE 50 PUSH AX ; SAVE DATA =3DFF B90800 MOV CX,08H =3E02 2BC0 SUB AX,AX =3E03EE2 CALL TRANSFER =3E45 EB60 3EA7 JMPS PIN16 = DOT_PTR04: =3E47 C706AE650400 MOV TRNCNT,4 =3E4D BBE565 MOV BX,OFFSET TOP_CODE+7 =3E50 E88F00 3EE2  ; BL = DOT 1 BYTE DATA =3E96 E872FE 3D0B CALL LOUT010 ; PRINT OUT =3E99 8B36B265 MOV SI,SAVE_SI =3E9D 46 INC SI =3E9E 8B0EB065 MOV CX,SAVE_4 BFBB65 MOV DI,OFFSET OUT_PTR =3E07 F3AB REP STOS WORD PTR [DI] ; CLEAR BUFFER =3E09 B108 MOV CL,08H =3E0B BFDE65 MOV DI,OFFSET TOP_CODE =3E0E F3AB  CALL TRANSFER = ; = ;************************************************ = ;* 8023 8 PIN DOT MATRIX TRANSFER ROUTINE * = ;**********************************CX =3EA2 E2E1 3E85 LOOP MAIN_OUT10 =3EA4 E9AAFE 3D51 JMP LOUT020 = ; = ;************************************************** = ;* SKSP 16 PIN DOT  REP STOS WORD PTR [DI] =3E10 58 POP AX = ;********************************************* = ;* PATTERN ADDRESS SET ROUTINE * = ;********************** = ; = PIN8: =3E53 803EB46502 CMP NEWCONTF,02H =3E58 7414 3E6E JE PIN8_00 =3E5A C606B46502 MOV NEWCONTF,02H =3E5F C606B66553 MATRIX TRNSFER ROUTINE * = ;************************************************** = ; = PIN16: =3EA7 803EB46501 CMP NEWCONTF,01H =3EAC 7414 3EC2 JE ************************************* = ; = PTN_ADD_SET: =3E11 2AE4 SUB AH,AH =3E13 B90500 MOV CX,05H =3E16 D3E0 SHL AX,CL =3E18 8BF0 MOV BYTE PTR CONTROL+1,'S' =3E64 C606B96530 MOV BYTE PTR CONTROL+4,30H =3E69 C606BA6538 MOV BYTE PTR CONTROL+5,38H = PIN8_00: =3E6E B90800 MOV CX,08H =3E71 B PIN16_00 =3EAE C606B46501 MOV NEWCONTF,01H =3EB3 C606B66549 MOV BYTE PTR CONTROL+1,'I' ; CONTROL CODE SET =3EB8 C606B96531 MOV BYTE PTR CONTROL+4,31H =3EBD C606BA6532 MOV  MOV SI,AX = ; =3E1A 06 PUSH ES ; SAVE ES =3E1B B800A0 MOV AX,0A000H ; CMOS SEGMENT =3E1E 8EC0 MOV ES,AX EDE65 MOV SI,OFFSET TOP_CODE ; TRNSFER DATA OFFSET TOP_CODE =3E74 BFBB65 MOV DI,OFFSET OUT_PTR ; DOT OUT_PUT BUFFFER ADDRESS = ; = SETCODE: =3E77 06  BYTE PTR CONTROL+5,32H = PIN16_00: =3EC2 BBDE65 MOV BX,OFFSET TOP_CODE =3EC5 BAE665 MOV DX,OFFSET BOTTOM_CODE =3EC8 BEBF65 MOV SI,OFFSET OUT_PTR+4 =3ECB B90800  POP CX =3EFB 5B POP BX =3EFC 0336AE65 ADD SI,TRNCNT =3F00 E2E3 3EE5 LOOP TRANSFER00 =3F02 C3 RET = ;--------------------------- SORDIO: MOV DL,0FFH =3F2B B90A00 MOV CX,0AH ; SET UPPER LIMIT =3F2E E468 IN AL,SODARS ; READ SIGNAL =3F30 8AE0 ORD010: MOV AH,AL ; SAVE OLD STATUS =3F32 E4 MOV CX,08H ; COUNTER = SKSP00: =3ECE 8A07 MOV AL,[BX] ; TOP_CODE BYTE DATA =3ED0 8804 MOV [SI],AL ; OUTPUT DA-------------------- = ; = ;********************************************* = ;* * = ;* LISTST (POLL LIST STATUS) 68 IN AL,SODARS ; READ SIGNAL =3F34 3AC4 CMP AL,AH CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 109 =3F36 E0F8 3F3TA BUFF = SI =3ED2 43 INC BX =3ED3 46 INC SI =3ED4 53 PUSH BX =3ED5 8BDA MOV BX,DX =3ED7 8A07 MOV AL,[BX]  * = ;* * = ;********************************************* = LISTST: = ;-------------------------------- R1.132 '83 20 LOOPNZ ORD010 = ;* = ;*** CHECK READ DATA *** = ;* =3F38 A819 TEST AL,19H ; CHECK MDL,ALM,RMR =3F3A 7404 3F40 JZ ORD ; BOTTOM_CODE BYTE DATA =3ED9 8804 MOV [SI],AL =3EDB 42 INC DX =3EDC 46 INC SI =3EDD 5B POP BX =3EDE E2EE 3ECE LOOP SKSP00 =/22 ------------------ =3F03 2EA08725 MOV AL,IOBYTE ; GET IOBYTE =3F07 24C0 AND AL,0C0H =3F09 3CC0 CMP AL,0C0H =3F0B 7510 3F1D JNE LISTST20 ; IF LIS020 ; IF CHECK BIT OFF =3F3C B200 MOV DL,00H =3F3E EB04 3F44 JMPS ORD030 ; ERROR RETURN =3F40 A802 ORD020: TEST AL,02H ; CHECK RDRQ =3F42 74E5 3F29 J3EE0 EB9D 3E7F JMPS MAIN_OUT = ; = ;********************************************* = ;* DOT MATRIX TRANSFER ROUTNE * = ;***********T FIELD IS NOT UL1 =3F0D B403 MOV AH,3 ; SET RETURN THE COMMAND STATUS FNC. =3F0F E87608 4788 CALL RS232_IO =3F12 32C0 XOR AL,AL ; SET AL=0 =3F14 F6C401 Z SORDIO =3F44 C3 ORD030: RET = ;********************************************* = ;* LIST USE AREA * = ;********************************************************************* = ; = TRANSFER: =3EE2 B90800 MOV CX,08H ; COUNTER = TRANSFER00: =3EE5 1E PUSH DS =3EE6 A1DC TEST AH,1 =3F17 7501 3F1A JNZ LISTST10 ; IF TRANSMITTER READY IS ON =3F19 C3 RET = LISTST10: =3F1A FEC8 DEC AL ; SET AL=0FFH =3F1C********** = DSEG $ = 006E SODAMD EQU 6EH ; WRITE SIGNAL 0 = 006E SODAW1 EQU 6EH ; WRITE SIGNAL 1 = 006C SODAW2 EQU 6CH 65 MOV AX,ALT_SEGMENT ; SEGMENT = D800H =3EE9 8ED8 MOV DS,AX =3EEB 8A04 MOV AL,BYTE PTR [SI]; =3EED 1F POP DS =3EEE 53 PUSH  C3 RET = LISTST20: = ;------------------------------------------------------------------- =3F1D 51 PUSH CX =3F1E B007 MOV AL,07H =3F ; WRITE SIGNAL 2 = 0068 SODARS EQU 68H ; READ SIGNAL = 006A SODAWD EQU 6AH ; WRITE DATA = 0020 ISIFT1 EQU 20H ; SIFT FRE <-- = 0060 BX CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 108 =3EEF 51 PUSH CX =3EF0 B90800 MOV CX,08H = TRANSFER01: 20 E66E OUT SODAW1,AL ; SET RMS SIGNAL =3F22 E80400 3F29 CALL SORDIO ; READ I/O STATUS =3F25 8AC2 MOV AL,DL =3F27 59 POP CX =3F28 C3  ISIFT2 EQU 60H ; SIFT FRE --> = 00A0 OSIFT1 EQU 0A0H ; SIFT FRE <-- = 00E0 OSIFT2 EQU 0E0H ; SIFT FRE --> = 24B6 CTLPFREE EQU 24B6H ; CTRL =3EF3 D0D0 RCL AL,01H =3EF5 D01F RCR BYTE PTR [BX],01H ; DATA BUFF IN CY FLAG DATA =3EF7 4B DEC BX =3EF8 E2F9 3EF3 LOOP TRANSFER01 =3EFA 59  RET = ;********************************************* = ;* READ I/O STATUS * = ;********************************************* =3F29 B2FF   P FREE = ; =65AB 00 BLDATA DB 0 ; SAVE BL DATA =65AC 00 SISOF DB 0 ; COUNT FLG =65AD 00 OLDFLG DB 0 ; SI-SO OLDFLG =65AE 0*************************************************************** = ;* REGSAVEINT * = ;********************************************************************* ;********************************************************************** = REGRESTORINT: =3FB7 58 POP AX =3FB8 A31766 MOV INT_RTN,AX =3FBB 5F5E 000 TRNCNT DW 0 ; TRANSFER COUNT = ; = ;----------* NEW CODE '83,04/12 --------------- =65B0 0000 SAVE_CX DW 0 =65B2 0000 SAVE_SI DW 0 =65* = REGSAVEINT: =3F5A 2EA31566 MOV CS:INT_AX,AX =3F5E 58 POP AX =3F5F 2EA31766 MOV CS:INT_RTN,AX =3F63 2E89261966 MOV CS:INT_SP,SP =3F68 2E8 POP DI ! POP SI =3FBD 5D5B POP BP ! POP BX =3FBF 5958 POP CX ! POP AX =3FC1 07 POP ES =3FC2 5A1F POP DX ! POP DS = B4 00 NEWCONTF DB 0 =65B5 1B0030303030 CONTROL DB 1BH,00H,30H,30H,30H,30H =65BB OUT_PTR RW 16 =65DB 00 END_CODE DB 0 = ; =65DC 00D8 ALT_SEGMENT C161B66 MOV CS:INT_SS,SS =3F6D 2E8C1E1D66 MOV CS:INT_DS,DS =3F72 2E8C061F66 MOV CS:INT_ES,ES =3F77 2E890E2166 MOV CS:INT_CX,CX =3F7C 2E89162366 MOV CS:INT_DX REGRESVINT010: = ;------------------------- R1.133 '83/03/31 -------------------- =3FC4 2EA11566 MOV AX,CS:INT_AX =3FC8 2E8B162366 MOV DX,CS:INT_DX = ;------------- DW 0D800H =65DE 000000000000 TOP_CODE DW 0,0,0,0 0000 =65E6 000000000000 BOTTOM_CODE DW 0,0,0,0 0000 = ;---------------------------------------------- = ; ,DX =3F81 8CC8 MOV AX,CS =3F83 8ED0 MOV SS,AX = ; AUTOMATICAL DISABLE INT. NEXT INSTRUCTION =3F85 BC6566 MOV SP,CS:OFFSET EXT_STACKBASE =3F88 2EA11566 ------------------------------------------------- =3FCD 2E8E161B66 MOV SS,CS:INT_SS =3FD2 2E8B261966 MOV SP,CS:INT_SP =3FD7 2EFF261766 JMP CS:INT_RTN = ; =  ; *R1.107 '83 05/14 DELETE = INCLUDE INT.LIB = CSEG $ = ;********************************************************************** =  MOV AX,CS:INT_AX = REGSVINT010: =3F8C 1E52 PUSH DS ! PUSH DX =3F8E 0650 PUSH ES ! PUSH AX =3F90 5153 PUSH CX ! PUSH BX =3F92 5556  ;********************************************************************** = ;* DATA ARDS * = ;******************************************************* ;* EXT_FNC_INT * CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 110 = ;**************** PUSH BP ! PUSH SI =3F94 57 PUSH DI =3F95 2E8E061B66 MOV ES,CS:INT_SS =3F9A 2E8B1E1966 MOV BX,CS:INT_SP =3F9F 268B4704 MOV AX,ES:04[BX] =3FA3 2500*************** = DSEG $ =65EE 01 INTTBL DB 1 =65EF 3D43 DW CALENDAR ; CALENDAR GET =65F1 02 DB 2 =65F2 3D43 DW ****************************************************** = EXT_FNC_INT: =3F45 E81200 3F5A CALL REGSAVEINT = ; =3F48 50 PUSH AX =3F49 8AC1 MOV 02 AND AX,0200H =3FA6 7401 3FA9 JZ REGSVINT020 =3FA8 FB STI = REGSVINT020: =3FA9 8CC8 MOV AX,CS =3FAB 8ED8 MOV D CALENDAR ; CALENDAR SET =65F4 03 DB 3 =65F5 0F45 DW MELODY ; MELODY =65F7 04 DB 4 =65F8 0F45 DW MELODY ; BUZZER =65F AL,CL ; FUNCTION =3F4B FEC0 INC AL =3F4D BEEE65 MOV SI,OFFSET INTTBL ; INT TABLE ADDR =3F50 E8FBF3 334E CALL LOOKUP = ; =3F53 58 S,AX =3FAD 8EC0 MOV ES,AX =3FAF A11566 MOV AX,INT_AX =3FB2 FC CLD CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE A 05 DB 5 =65FB DC3F DW CUREAD ; CURSOR READ =65FD 06 DB 6 =65FE 2940 DW APO ; APO (OUTO POWER OFF) =6600 07  POP AX =3F54 FFD3 CALL BX ; = ; =3F56 E85E00 3FB7 CALL REGRESTORINT = ; =3F59 CF IRET = ;*******111 =3FB3 FF261766 JMP INT_RTN = ;********************************************************************** = ;* REGRESTORINT * =   DB 7 =6601 1D40 DW CLRFIFO ; FIFO BUFFER CLEAR =6603 08 DB 8 =6604 3940 DW DMAXFER ; DMA XFER =6606 09 DB 9 =6607AC6 MOV AL,DH ; LA =3FE4 FEC0 INC AL =3FE6 E82800 4011 CALL CUR010 ; ASCII <--HEX. =3FE9 A26866 MOV KBWKLAH,AL =3FEC 88266966  USCBIOS.A86 Customized Basic I/O System V1 PAGE 114 = ;********************************************************************** = ;* NULL RETURN ROUTINE  AD42 DW RWCMOS ; WRITE CMOS =6609 0A DB 10 =660A AD42 DW RWCMOS ; READ CMOS =660C 0B DB 11 =660D 4C47 MOV KBWKLAL,AH =3FF0 8AC2 MOV AL,DL =3FF2 FEC0 INC AL =3FF4 E81A00 4011 CALL CUR010 ; ASCII <-- HEX. =3FF7 A26B66 MOV KBWKCAH,AL =3FFA 88266C66  * = ;********************************************************************** = NULLRTN: =4028 C3 RET END =  DW RS232INIT ; RS232C INITIALIZE = ;------------------------------------ R1.133 '83/03/31 ---------- =660F 10 DB 16 =6610 5048 DW RS232_IO2 ; OPTION MOV KBWKCAL,AH =3FFE 06 PUSH ES =3FFF 8E061D66 MOV ES,INT_DS =4003 BE6666 MOV SI,OFFSET KBCURSOR =4006 8B3E2366 MOV DI,INT_DX =400A B90800  INCLUDE APO.LIB = ;********************************************************************** = ;* APO (AUTO POWER OFF) * =  RS232C INTERFACE (CMA2) = ;-------------------------------------------------------------- =6612 00 DB 0 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1  MOV CX,8 =400D F3A4 REP MOVS AL,AL =400F 07 POP ES =4010 C3 RET = ; = CUR010: =4011 2AE4  ;********************************************************************** = ; OUTPUT PORT # = 5BH , AL = 1 (POWER OFF) = ; 0 (DO NOTHING) = APO: PAGE 112 =6613 2840 DW NULLRTN ; STOPPER (NULL) = ; =6615 0000 INT_AX DW 0 =6617 0000 INT_RTN DW 0 =6619 0000 INT_SP DW 0  SUB AH,AH =4013 F6366566 DIV KBWK10 =4017 80CC30 OR AH,30H =401A 0C30 OR AL,30H =401C C3 RET = DSEG $ =6665 0A  =4029 B9F401 MOV CX,500 ; 5 SEC WAIT COUNT =402C 51 APO010: PUSH CX =402D B9000C MOV CX,0C00H ; 10 MS WAIT COUNT =4030 E2FE 4030 L=661B 0000 INT_SS DW 0 =661D 0000 INT_DS DW 0 =661F 0000 INT_ES DW 0 =6621 0000 INT_CX DW 0 =6623 0000 INT_DX DW 0 =6625 EXTSTACK R KBWK10 DB 0AH = ; =6666 1B KBCURSOR DB 1BH ; ESC =6667 5B DB '[' =6668 00 KBWKLAH DB 0 =6669 00 OOP $ =4032 59 POP CX =4033 E2F7 402C LOOP APO010 = ; =4035 B001 MOV AL,01H =4037 E65B OUT 5BH,AL = ; = W 32 = 6665 EXTSTACKBASE EQU $ CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 113 = EJECT =  KBWKLAL DB 0 =666A 3B DB ';' =666B 00 KBWKCAH DB 0 =666C 00 KBWKCAL DB 0 =666D 52 DB 'R' =  INCLUDE DMAXFER.LIB CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 115 = EJECT = ;'83 07/07 =  CSEG $ = ;********************************************************************** = ;* CURSOR READ ROUTINE * = ;************************* ;********************************************************************** = ;* KB FIFO BUFFER CLEAR ROUTINE * = ;*************************************************** ;********************************************************************** = ;* DIRECT CRT I/O ROUTINE (NOT USE DMA) * = ;* INPUT DX = DRB OFFS********************************************* = CUREAD: =3FDC E875FC 3C54 CALL KBCSAD ; CURSOR ADDR READ =3FDF E8A1FC 3C83 CALL KBSACV ; SCREEN MEMORY ADDR TO LA,CA CONV. =3FE2 8******************* = CSEG $ = CLRFIFO: =401D C606166100 MOV KBIN,0 =4022 C606176100 MOV KBOUT,0 =4027 C3 RET CP/M ASM86 1.1 SOURCE: ET * = ;********************************************************************** = CSEG $ = ; = ; STORE DISPLAY REQUEST BLOCK = N = ; = ;********************************************************************** = ;* DISPLAY STRING DATA ON CRT * = ;*******N * = ;********************************************************************** = DMAGDC3: =4095 803E736600 CMP DMALA,0 ; IF LA = 0 =409A  ; = DMAXFER: =4039 89167066 MOV DRBOFF,DX ; SAVE ADDRESS OF INPUT DISPLAY REQUEST BLOCK =403D 1E06 PUSH DS ! PUSH ES ; =403F B90D00 MOV *************************************************************** = DMAGDC1: =406E C606866638 MOV GDCWRT,GDCWRT_H ; HIGH BYTE WRITE COMMAND =4073 C606856600 MOV GDCMSK_L1,00H ; LOW BYTE MASK SE7420 40BC JE DMAGDC3RET ; NOT ROLL DOWN =409C 2AED SUB CH,CH ; =409E 8A0E7366 MOV CL,DMALA ; CX = ROLL DOWN COUNT (LINE NUMBER) = DMAGDC31: =CX,0DH ; CX = LENGTH OF DISPLAY REQUEST BLOCK =4042 8BF2 MOV SI,DX ; SI = ADDRESS OF DISPLAY REQUEST BLOCK =4044 BF7266 MOV DI,DMAGDC_DRB ; DI = ADDRESS OF DISPLAY REQUEST BLOCK WORK ART =4078 E85500 40D0 CALL SENDDMAGDC ; DISPLAY =407B C3 RET ; RETURN = ; = ;********************************************************************40A2 51 PUSH CX ; =40A3 E8CEF9 3A74 CALL ROLLDOWN ; ROLL DOWN =40A6 59 POP CX ; =40A7 8A36DB64 MOV DH,LA ; =40AB 8A16DEA =4047 8CD8 MOV AX,DS ; =4049 8EC0 MOV ES,AX ; ES = CBIOS DATA SEGMENT =404B 8E1E1D66 MOV DS,INT_DS ; DS = INPUT DATA SEGMENT =404F F3A4 ** = ;* REPORT CURSOR POSITION * = ;********************************************************************** = DMAGDC2: CP/M ASM86 1.1 SOURCE:C64 MOV DL,CA ; =40AF E844FA 3AF6 CALL KBLCCV ; TO SCREEN MEMORY ADDRESS =40B2 E899FA 3B4E CALL KBCSRO ; CURSOR POSITION OUTPUT =40B5 E2EB 40A2 LOOP DM REP MOVS AL,AL ; STORE DISPLAY REQUEST BLOCK =4051 071F POP ES ! POP DS ; = ; = ; SENCE DMAXFER COMMAND =4053 A07266 MOV AL,DMACH0_CMD ; AL USCBIOS.A86 Customized Basic I/O System V1 PAGE 116 =407C E8D5FB 3C54 CALL KBCSAD ; CURSOR ADDR READ =407F E801FC 3C83 CALL KBSACV ; SCREEN MEMORY ADDR TO AGDC31 ; NEXT ROLL DOWN =40B7 C6066F6601 MOV FLAGX,1 ; = DMAGDC3RET: =40BC C3 RET ; RETURN = ; = ;********** = DMAXFER COMMAND NUMBER =4056 40 INC AX ; =4057 BE8766 MOV SI,DMAXFERTBL ; DMAXFER FUNCTION TABLE ADDRESS =405A E8F1F2 334E CALL LOOKUP ; TABLE LOOK UP =405D FLA , CA CONV. = ;--------------R1.107 '83 5/27 (DELETE)-------------------------------- = ; DH = LA = ; DL = CA = ************************************************************ = ;* ROLL UP SCREEN * = ;********************************************************************** FD3 CALL BX ; =405F C3 RET ; RETURN TO INT.LIB = ; = ;********************************************************************** =  ;---------------------------------------------------------------------- =4082 06 PUSH ES ; =4083 8B1E7066 MOV BX,DRBOFF ; BX = ADDR OF INPUT PARAMETER TABLE =4087 8E061D66 = DMAGDC4: =40BD 803E736600 CMP DMALA,0 ; IF LA = 0 =40C2 740B 40CF JE DMAGDC4RET ; NOT ROLL UP =40C4 2AED SUB CH,CH ; =40C6 8A0E7366  ;* DISPLAY VIDEO MEMORY FORMAT ON CRT * = ;********************************************************************** = DMAGDC0: =4060 C606866620  MOV ES,INT_DS ; DS = INPUT DATA SEGMENT =408B 26887701 MOV ES:1[BX],DH ; SET LA TO USER DRB =408F 26885702 MOV ES:2[BX],DL ; SET CA TO USER DRB =4093 07 P MOV CL,DMALA ; CX = ROLL UP COUNT (LINE NUMBER) = DMAGDC41: =40CA E807F9 39D4 CALL ROLLUP ; ROLL UP =40CD E2FB 40CA LOOP DMAGDC41 ; NEXT ROLL UP =  MOV GDCWRT,GDCWRT_W ; WORD WRITE COMMAND =4065 C6068566FF MOV GDCMSK_L1,0FFH ; LOW BYTE MASK RESET =406A E86300 40D0 CALL SENDDMAGDC ; DISPLAY =406D C3 RET ; RETUROP ES ; =4094 C3 RET ; = ; = ;********************************************************************** = ;* ROLL DOWN SCREE  DMAGDC4RET: =40CF C3 RET ; RETURN = ; = ;********************************************************************** = ;* CMD# 0 / 1 C70681660000 MOV NOC2,0 ; IF NOT OVER GDCMAX =411A 8B0E7566 MOV CX,DMANOC ; NOC2 = 0 =411E 890E7F66 MOV NOC1,CX ; NOC1 = DMANOC =4122 A18366 MOV 00 4245 CALL SENDGDC ; DISPLAY CHARACTERS (1) =416D 833E816600 CMP NOC2,0 ; IF NOC2 = 0 =4172 7420 4194 JE SENDDG019 ; THEN NOT DISPLAY SECOND CHARACTERS =4174 BB5000  COMMON ROUTINE * = ;********************************************************************** CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1  AX,DMALACA ; SCREEN MEMORY ADDRESS TO START DISPLAY =4125 03C1 ADD AX,CX ; =4127 3DF00F CMP AX,GDCMAX ; IF OVER GDCMAX =412A 760E 413A JBE SENDDG005 ; NOC MOV BX,STLINE ; SCREEN MEMORY ADDRESS TO START DISPLAY =4177 A17766 MOV AX,DMADOFF ; =417A 8B0E7F66 MOV CX,NOC1 ; NUMBER OF CHARACTERS TO BE DISPLAYED (1) =417E 803E726600  PAGE 117 = SENDDMAGDC: =40D0 803E736618 CMP DMALA,24 ; IF DMALA IS OVER 24 =40D5 7605 40DC JBE SENDDG001 ; THEN TREAT AS 24 =40D7 C606736618 MOV DMAL2 = REMAINDER =412C 2DF00F SUB AX,GDCMAX ; NOC1 = DMANOC - NOC2 =412F A38166 MOV NOC2,AX ; =4132 2B0E8166 SUB CX,NOC2 ; =4136 890E7F66 MOV N CMP DMACH0_CMD,0 ; =4183 7502 4187 JNE SENDDG015 ; IF NOT WORD WRITE =4185 D1E1 SHL CX,1 ; CX * 2 = SENDDG015: =4187 03C1 ADD A,24 ; = SENDDG001: =40DC 803E74664F CMP DMACA,79 ; IF DMACA IS OVER 79 =40E1 7605 40E8 JBE SENDDG002 ; THEN TREAT AS 79 =40E3 C60674664F MOV DMACA,79 OC1,CX ; = SENDDG005: =413A 833E796600 CMP DMADBAS,0 ; IF DMADBAS = 0, THEN NOT DISPLAY CHARACTERS =413F 745B 419C JE SENDDG02 ; = SENDDG01: =4141 AX,CX ; (DMADOFF)+(WORD COUNT)+1 =4189 8B167966 MOV DX,DMADBAS ; BASE OF DATA =418D 8B0E8166 MOV CX,NOC2 ; NUMBER OF CHARACTERS TO BE DISPLAYED (2) =4191 E8B100 4245 CALL ; = SENDDG002: =40E8 8A367366 MOV DH,DMALA ; START OF LINE ADDRESS =40EC 8A167466 MOV DL,DMACA ; START OF COLUMN ADDRESS =40F0 52 PUSH DX  2EA1CE3B MOV AX,CRTDSP ; SAVE CURSOR DISP PARAMETER =4145 50 PUSH AX ; =4146 E8D9F6 3822 CALL CURSOROFF ; DISABLE CURSOR DISPLAY = ;--------- SENDGDC ; DISPLAY CHARACTERS (2) = SENDDG019: =4194 58 POP AX ; =4195 2EA3CE3B MOV CRTDSP,AX ; RESTORE CURSOR DISP PARAMETER =4199 E81BFA 3BB7  ; =40F1 E802FA 3AF6 CALL KBLCCV ; CONVERT SCREEN MEMORY ADDRESS =40F4 5A POP DX ; =40F5 A38366 MOV DMALACA,AX ; SAVE SCREEN MEMORY ADDRESS TO START DI------------------------------------------------------------- = ; R1.108 '83 07/07 (DELETE) = ;---------------------------------------------------------------------- =4149 C6066E6601 MOV  CALL KBCSRD ; OUTPUT CURSOR DISP COMMAND = SENDDG02: =419C 833E7D6600 CMP DMAABAS,0 ; =41A1 746F 4212 JE SENDDG03 ; IF DMAABAS = 0, THEN DEFAULT =41A3 C6066E66SPLAY =40F8 833E756600 CMP DMANOC,0 ; IF NO CHARACTER TO BE DISPLAYED =40FD 7503 4102 JNE SENDDG003 ; =40FF E93401 4236 JMP SENDDGRET ; THEN DISPLAY ONLY CURSOR =  DMAXFLG,1 ; DMA EXECUTE DIRECT CRT I/O =414E A08566 MOV AL,GDCMSK_L1 ; GDC MASK LOW BYTE SET/RESET =4151 2EA25F42 MOV GDCMSK_L,AL ; =4155 2EC6066142FF MOV GDCMSK_H,GDCMSK_H1 ; 01 MOV DMAXFLG,1 ; DMA EXECUTE DIRECT CRT I/O =41A8 C606866630 MOV GDCWRT,GDCWRT_L ; LOW BYTE GDCWRT =41AD 2EC6065F42FF MOV GDCMSK_L,GDCMSK_L2 ; GDC MASK LOW BYTE RESET =41B3 2EC606614200  SENDDG003: =4102 E81AFA 3B1F CALL LACACHNG ; GET SCREEN ADDRESS =4105 B9D007 MOV CX,COLUMN*DPLINE ; =4108 2BC8 SUB CX,AX ; REMAINDER IN SCREEN =410A 390E7566 GDC MASK HIGH BYTE RESET =415B 8B1E8366 MOV BX,DMALACA ; SCREEN MEMORY ADDRESS OT START DISPLAY CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 118 =415F A1 MOV GDCMSK_H,GDCMSK_H2 ; GDC MASK HIGH BYTE SET =41B9 8B1E8366 MOV BX,DMALACA ; SCREEN MEMORY ADDRESS TO SET ATTRIBUTE =41BD 81C30010 ADD BX,1000H ; =41C1 A17B66 MOV  CMP DMANOC,CX ; IF DMANOC IS OVER THE REMAINDER =410E 7604 4114 JBE SENDDG004 ; =4110 890E7566 MOV DMANOC,CX ; THEN TREAT AS REMAINDER = SENDDG004: =41147766 MOV AX,DMADOFF ; OFFSET FIRST DATA AREA =4162 8B167966 MOV DX,DMADBAS ; BASE OF DATA =4166 8B0E7F66 MOV CX,NOC1 ; NUMBER OF CHARACTERS TO BE DISPLAYED (1) =416A E8D8  AX,DMAAOFF ; OFFSET FIRST ATTRIBUTE AREA =41C4 8B167D66 MOV DX,DMAABAS ; BASE OF ATTRIBUTE =41C8 8B0E7F66 MOV CX,NOC1 ; NUMBER OF CHARACTERS TO SET ATTRIBUTE (1) =41CC E87600 4245  MUL CL ; =4210 E2FC 420E LOOP SENDDG023 ; = ;---------------------------------------------------------------------- = SENDDG03: =4212 E87EF9 3B93 CALL SENDGDC: =4245 2E881E5942 MOV GDCCSRW_1,BL ; SET ADDRESS TO DISPLAY CURSOR (LOW BYTE) =424A 2E883E5B42 MOV GDCCSRW_2,BH ; SET ADDRESS TO DISPLAY CURSOR (HIGH BYTE) =424F 1E  CALL SENDGDC ; ATTRIBUTE SET (1) =41CF 833E816600 CMP NOC2,0 ; IF NOC2 = 0, THEN NOT SET SECOND ATTRIBUTE =41D4 7415 41EB JE SENDDG021 ; =41D6 BB5010 MOV BX,STL KBMOUT ; MULTI COMMAND OUTPUT TO GDC =4215 03 DB 03H ; =4216 4A42 DW 424AH ; GDC MASK WRITE COMMAND =4218 FF40 DW 40FFH ; LOW  PUSH DS ; =4250 52 PUSH DX ; =4251 50 PUSH AX ; =4252 51 PUSH CX ; = ; = INE+1000H ; SCREEN MEMORY ADDRESS TO SET ATTRIBUTE =41D9 A17B66 MOV AX,DMAAOFF ; OFFSET ATTRIBUTE AREA =41DC 03067F66 ADD AX,NOC1 ; SECOND DMA DATA OFFSET =41E0 8B167D66 MOV DBITE MASK RESET =421A FF40 DW 40FFH ; HIGH BYTE MASK RESET =421C C6066E6600 MOV DMAXFLG,0 ; NON EXECUTE DIRECT CRT I/O =4221 A18366 MOV AX,DMALACA ; NEW SCREEN ME ; SET GDC COMMANDS AND PARAMETERS = ; =4253 E83DF9 3B93 CALL KBMOUT ; MULTI COMMAND OUTPUT TO GDC =4256 06 DB 06H ; NUMBER OF COMMAND AND PARAMETERS =4257 4942 X,DMAABAS ; BASE OF ATTRIBUTE =41E4 8B0E8166 MOV CX,NOC2 ; NUMBER OF CHARACTERS TO SET ATTRIBUTE (2) =41E8 E85A00 4245 CALL SENDGDC ; ATTRIBUTE SET (2) = SENDDG021: =41EB MORY ADDRESS =4224 03067566 ADD AX,DMANOC ; IF NOC2 = 0 =4228 833E816600 CMP NOC2,0 ; AX = DMALACA + NOC1 =422D 7407 4236 JE SENDDGRET ; =422F B85000 M DW 4249H ; CURSOR OUTPUT COMMAND =4259 00 GDCCSRW_1 DB 00H ; CURSOR ADDRESS (LOW BYTE) =425A 40 DB 40H ; =425B 00 GDCCSRW_2 DB 0A18366 MOV AX,DMALACA ; SCREEN MEMORY ADDRESS TO START DISPLAY (1) =41EE 8B0E7F66 MOV CX,NOC1 ; NUMBER OF CHARACTERS TO BE DISPLAYED (1) =41F2 E8A800 429D CALL GENATMAP ; GEOV AX,STLINE ; IF NOC2 > 0 =4232 03068166 ADD AX,NOC2 ; AX = STLINE + NOC2 = SENDDGRET: =4236 E815F9 3B4E CALL KBCSRO ; NEW CURSOR POSITION OUTPUT =4239 E847FA 0H ; CURSOR ADDRESS (HIGH BYTE) CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 120 =425C 40 DB 40H ; =425D 4A42 NERATE ATTRIBUTE BIT MAP (1) =41F5 833E816600 CMP NOC2,0 ; IF NOC2 IS ZERO, THEN COME TO END GENERATING =41FA 740A 4206 JE SENDDG022 ; ATTRIBUTE BIT MAP --- DELAY --- =41FC B85000  3C83 CALL KBSACV ; CHNG SCREEN MEMORY ADD TO LA/CA = SENDDGRET1: =423C 8836DB64 MOV LA,DH ; RESET LA =4240 8816DC64 MOV CA,DL ; RESET CA =4244 C3  DW 424AH ; GDC MASK WRITE COMMAND =425F 00 GDCMSK_L DB 00H ; LOW BYTE MASK =4260 40 DB 40H ; =4261 00 GDCMSK_H DB 00H ; HIGH B MOV AX,STLINE ; SCREEN MEMORY ADDRESS TO START DISPLAY (2) =41FF 8B0E8166 MOV CX,NOC2 ; NUMBER OF CHARACTERS TO BE DISPLAYED (2) =4203 E89700 429D CALL GENATMAP ; GENERATE ATTRIBUTE BIT MAP RET ; RETURN = ; = ;********************************************************************** = ;* SET DMAGDC COMMAND AND PARAMETERS YTE MASK =4262 40 DB 40H ; = ; =4263 59 POP CX ; =4264 5E POP SI ; =4265 E82E00 4296 CALL GD (2) = ;---------------------------------------------------------------------- CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 119 = SENDD * = ;* INPUT : REGISTER AX = USER BUFFER ADDRESS * = ;* BX = SCREEN MEMORY ADDRESS * = ;* CEMPCHK ; GDC FIFO EMPTY CHECK =4268 A08666 MOV AL,GDCWRT ; =426B E642 OUT GDCCMDW,AL ; OUTPUT COMMAND =426D 1F POP DS ; =426E 3C20 G022: =4206 8B0E7566 MOV CX,DMANOC ; DELAY =420A D1E1 SHL CX,1 ; =420C D1E1 SHL CX,1 ; = SENDDG023: =420E F6E1  CX = NUMBER OF CHARACTER * = ;* DX = USER BUFFER SEGMENT * = ;********************************************************************** =   CMP AL,GDCWRT_W ; IF WORD WRITE =4270 7514 4286 JNE SENDGDC020 ; = SENDGDC010: =4272 F7C10700 TEST CX,0007H ; =4276 7503 427B JNZ SENDGDC015 **** = GENATMAP: =429D 51 PUSH CX ; CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 121 =429E E815FA 3CB6  DW 0 ; NUMBER OF CHARACTORS =6677 0000 DMADOFF DW 0 ; DMA DATA OFFSET =6679 0000 DMADBAS DW 0 ; DMA DATA BASE =667B 0000 DMAAOFF DW 0 ; DMA ATTR ; =4278 E81B00 4296 CALL GDCEMPCHK ; GDC FIFO EMPTY CHECK = SENDGDC015: =427B AD LODS WORD PTR SI ; =427C E640 OUT GDCPARAW,AL ; LOW BYTE OUTPUT  CALL GENATBIT ; GENERATE ATTRIBUTE MASK BIT =42A1 59 POP CX ; = GENATMAP1: =42A2 0815 OR [DI],DL ; =42A4 D0C2 ROL IB OFFSET =667D 0000 DMAABAS DW 0 ; DMA ATTRIB BASE = ; =667F 0000 NOC1 DW 0 ; PERT OF DMANOC (1) =6681 0000 NOC2 DW 0 ; PERT OF=427E 8AC4 MOV AL,AH ; =4280 E640 OUT GDCPARAW,AL ; HIGH BYTE OUTPUT =4282 E2EE 4272 LOOP SENDGDC010 ; NEXT DATA OUTPUT =4284 EB0E 4294 JMPS SENDGDL,1 ; =42A6 7301 42A9 JNB GENATMAP2 ; =42A8 47 INC DI ; = GENATMAP2: =42A9 E2F7 42A2 LOOP GENATMAP1 ; GENERATE ATTRIBUTE BIT M DMANOC (2) =6683 0000 DMALACA DW 0 ; SCREEN MEMORY ADDRESS TO START DISPLAY = ; = ; GDC INSTRUCTION CODE AND PARAMETER = 0042 GDCCMDW EQU 42H DCRET ; = ; = SENDGDC020: =4286 F7C10F00 TEST CX,000FH ; =428A 7503 428F JNZ SENDGDC025 ; =428C E80700 4296 CALL GDCEMPCHK ; GDAP =42AB C3 RET ; END OF GENERATE BIT MAP = ; = ;********************************************************************** = ;* DMA XFER RETU ; GDC COMMAND WRITE = 0040 GDCPARAW EQU 40H ; GDC PARAMETER WRITE = 0040 GDCSTATUS EQU 40H ; GDC STATUS READ = ; = 0FF0 GDCMAX EQU 51*C FIFO EMPTY CHECK = SENDGDC025: =428F AC LODS BYTE PTR SI ; =4290 E640 OUT GDCPARAW,AL ; LOW OR HIGH BYTE OUTPUT =4292 E2F2 4286 LOOP SENDGDC020 ;RN * = ;********************************************************************** = DMAXFERRET: =42AC C3 RET ; RETURN = COLUMN ; VIDEOMEMORY SIZE ( CHARACTOR NO.) =6685 00 GDCMSK_L1 DB 00H ; DATA LOW BYTE MASK = 00FF GDCMSK_H1 EQU 0FFH ; DATA HIGH BYTE MASK = 00FF GDCMSK_L2 EQU 0FFH  NEXT DATA OUTPUT = SENDGDCRET: =4294 1F POP DS ; =4295 C3 RET ; RETURN = ; = GDCEMPCHK: =4296 E440  ; = ;********************************************************************** = ;* DMAXFER DATA AREA * = ;************** ; ATTRIB LOW BYTE MASK = 0000 GDCMSK_H2 EQU 00H ; ATTRIB HIGH BYTE MASK = ; CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 122  IN AL,GDCSTATUS ; GDC STATUS READ =4298 A804 TEST AL,04H ; =429A 74FA 4296 JZ GDCEMPCHK ; IF NOT GDC FIFO EMPTY =429C C3 RET ******************************************************** = DSEG $ = ; =666E 00 DMAXFLG DB 0 ; DMA EXECUTE FLAG =666F 00 FLAGX DB 0  =6686 00 GDCWRT DB 00H ; GDC WRITE CMD WORK AREA = 0020 GDCWRT_W EQU 20H ; GDC WORD GDCWRT = 0030 GDCWRT_L EQU 30H ; GDC LOW BYTE GDCWRT = 0038  ; = ; = ;********************************************************************** = ;* GENERATION ATTRIBUTE BIT MAP * = ;*  ; CMD#3 FLAG = ; =6670 0000 DRBOFF DW 0 ; SAVE DISPLAY REQUEST BLOCK OFFSET = ; STORED DISPLAY REQUEST BLOCK = 6672 DMAGDC_DRB EQU OFFSET $ =6672 GDCWRT_H EQU 38H ; GDC HIGH BYTE GDCWRT = ; = 6687 DMAXFERTBL EQU OFFSET $ =6687 01 DB 1 ; DMAGDC CMD# = 0 =6688 6040  INPUT AX = SCREEN ADDRESS * = ;* CX = WORD COUNT * = ;****************************************************************** 00 DMACH0_CMD DB 0 ; DMAGDC CMD# (0-4) =6673 00 DMALA DB 0 ; LINE ADDRESS =6674 00 DMACA DB 0 ; COLUMN ADDRESS =6675 0000 DMANOC   DW DMAGDC0 =668A 02 DB 2 ; DMAGDC CMD# = 1 =668B 6E40 DW DMAGDC1 =668D 03 DB 3 ; DMAGDC CMD# = 2 =63A4 REP MOVS AL,AL =42C0 1F POP DS = ; =42C1 833E9C6600 CMP PSIZE,0 =42C6 7E3E 4306 JLE RWCMOSRET ; IF INPUT SIZE ERROR  * = ;********************************************************************** = RCMOS: =4307 1E06 PUSH DS ! PUSH ES =4309 BE000E MOV SI,CMOSOFF ; =68E 7C40 DW DMAGDC2 =6690 04 DB 4 ; DMAGDC CMD# = 3 =6691 9540 DW DMAGDC3 =6693 05 DB 5 =42C8 813E9C660002 CMP PSIZE,512 =42CE 7F36 4306 JG RWCMOSRET ; IF INPUT SIZE ERROR = ; =42D0 833E9A6600 CMP PCMOSADDR,0 =42D5 7C2F 4306 JL 430C 03369A66 ADD SI,PCMOSADDR ; SI = CMOS READ AREA OFFSET =4310 8B3E9E66 MOV DI,PUSROFF ; DI = USER BUFFER OFFSET =4314 8E06A066 MOV ES,PUSRBAS ; ES =  ; DMAGDC CMD# = 4 =6694 BD40 DW DMAGDC4 =6696 00 DB 0 ; STOPPER (NULL) =6697 AC42 DW DMAXFERRET = ; =  RWCMOSRET ; IF INPUT CMOS ADDR ERROR =42D7 813E9A66FF01 CMP PCMOSADDR,511 =42DD 7F27 4306 JG RWCMOSRET ; IF INPUT CMOS ADDR ERROR = ; =42DF B80002 USER BUFFER BASE =4318 B800A0 MOV AX,CMOSBAS ; DS = CMOS AREA BASE =431B 8ED8 MOV DS,AX =431D F3A4 REP MOVS AL,AL =431F 071F POP ES ! POP DS INCLUDE USCMOS.LIB CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 123 = EJECT = ;******************** MOV AX,512 =42E2 2B069A66 SUB AX,PCMOSADDR ; R/W MAX SIZE =42E6 3B069C66 CMP AX,PSIZE =42EA 7C03 42EF JL RWCMOS010 ; IF R/W MAX SIZE < R/W SIZE =42EC A19C6 =4321 C3 RET = ; = ;********************************************************************** = ;* WRITE CMOS MEMORY ************************************************** = ;* CMOS READ/WRITE ROUTINE * = ;* INPUT CL = 8 (WRITE) * = 6 MOV AX,PSIZE = RWCMOS010: =42EF 8BC8 MOV CX,AX = ; =42F1 E80D02 4501 CALL PSCMSE ; CMOS ACCESS ENABLE =  * = ;********************************************************************** = WCMOS: =4322 1E06 PUSH DS ! PUSH ES =4324 8B369E66 MOV SI,PUSROFF ; SI = ;* = 9 (READ) * = ;* DS,DX = WORD 0 ; CMOS ADDR (0 - 511) * = ;* 1 ; SIZE ; =42F4 803E996608 CMP CMOSFLG,8 =42F9 7405 4300 JE RWCMOS020 ; IF CMOS WRITE = ; =42FB E80900 4307 CALL RCMOS ; READ CMOS =42FE EB03  USER BUFFER OFFSET =4328 BF000E MOV DI,CMOSOFF ; =432B 033E9A66 ADD DI,PCMOSADDR ; DI = CMOS WRITE OFFSET =432F B800A0 MOV AX,CMOSBAS ; ES = CMOS BA (1 - 512 BYTE) * = ;* 2 ; USER BUFFER OFFSET * = ;* 3 ; USER BUFFER BASE * = ;************ 4303 JMPS RWCMOS030 = ; = RWCMOS020: =4300 E81F00 4322 CALL WCMOS ; WRITE CMOS = ; = RWCMOS030: =4303 E80202 SE =4332 8EC0 MOV ES,AX =4334 8E1EA066 MOV DS,PUSRBAS ; DS = USER BUFFER BASE =4338 F3A4 REP MOVS AL,AL =433A 071F POP ES ! POP DS =433C C3 ********************************************************** = CSEG $ = RWCMOS: =42AD 880E9966 MOV CMOSFLG,CL ; SAVE R/W FUNCTION =42B1 1E PUS 4508 CALL PSCMSD ; CMOS ACCESS DISABLE CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 124 = ; = RWCMOSRET RET = ; = ;********************************************************************** = ;* CMOS R/W USE AREA * = H DS =42B2 8BF2 MOV SI,DX =42B4 BF9A66 MOV DI,OFFSET CMOSPRM ; DI = CMOS R/W PARAMETER AREA =42B7 8E1E1D66 MOV DS,INT_DS =42BB B90800 MOV CX,8 =42BE F: =4306 C3 RET = ; = ;********************************************************************** = ;* READ CMOS MEMORY   ;********************************************************************** = DSEG $ = 0E00 CMOSOFF EQU 0E00H ; CMOS AREA OFFSET = A000 CMOSBAS E**** = ;* * = ;* IN : * = ;* 1) DS,DX; P.DATA AREA POP BX ; =4363 A0A466 SCL150: MOV AL,YYSAVE ; YY =4366 1E PUSH DS =4367 8E1E1D66 MOV DS,INT_DS =436B 8807 MOV DS:[BX],AL =QU 0A000H ; CMOS AREA BASE = ; =6699 00 CMOSFLG DB 0 ; CMOS R/W FUNCTION = 669A CMOSPRM EQU OFFSET $ =669A 0000 PCMOSADDR DW  * = ;* CL; 00H; GET, 01H; SET * = ;* * = 436D 1F POP DS CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 126 = ;* = ;***** CLOCK READ PROC. ***** 0 ; R/W CMOS ADDR =669C 0000 PSIZE DW 0 ; R/W CMOS SIZE =669E 0000 PUSROFF DW 0 ; USER BUFFER OFFSET =66A0 0000 PUSRBAS DW ;* OUT : * = ;* 1) AX,BP; BREAK * = ;* ********************************** =436E 53 SCL200: PUSH BX =436F 55 PUSH BP ; =4370 BBA766 MOV BX,OFFSET CLKWK0 =4373 E8C600 443C CALL PSCLKR ; C 0 ; USER BUFFER BASE = INCLUDE CALENDAR.LIB CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 125 = EJ * = ;********************************************************************** = ;* = ;***** SET/GET CALENDAR & CLOCK ******************************* = LOCK READ RTN. =4376 5D POP BP =4377 5B POP BX =4378 8BFB MOV DI,BX ; =437A 83C705 ADD DI,5 =437D BEA766 MOV SI,OFFSECT = 0058 CLKPOT EQU 58H ; PORT NO = 0005 MODCAN EQU 05H ; MODE CANCEL = 0007 CLKSTB0 EQU 07H ; STB 0 = 0008 CLKSTB1 EQU 08H;  CALENDAR: =433D 880EA266 MOV RWFLG,CL ; SAVE SET/GET =4341 8BDA MOV BX,DX ; BX = ADDR OF DATA AREA =4343 8BC1 MOV AX,CX ; AX = FNC CODE =4345 C6061160ET CLKWK0 =4380 B90500 MOV CX,5 =4383 06 PUSH ES =4384 8E061D66 MOV ES,INT_DS ; USER AREA DATA SEG. =4388 FC SCL300: CLD =4389 AC LODS  ; STB 1 = CSEG $ = ;********************************************************************** = ;* * = 01 MOV SYSTMFLG,1 ; CLOCK BUSY FLAG ON = ;* = ;***** FLAG CHECK PROC. *************************************** = ;* =434A 80F901 CMP  BYTE PTR[SI] =438A FD STD =438B AA STOS BYTE PTR [DI] =438C E2FA 4388 LOOP SCL300 =438E FC CLD =438F 43 SCL400: INC BX =4390 268A07  ;* CALENDAR CLOCK SERVICE ROUTINE * = ;* * = ;*************************************** CL,1 ; CHK SET/GET F. =434D 7452 43A1 JE SCL500 ; JMP IF SET = ;* =434F 803EA36600 CMP YYFLG,0 ; CHK YY READ F. =4354 750D 4363 JNE SCL150  MOV AL,ES:BYTE PTR[BX] =4393 FEC0 INC AL =4395 268807 MOV ES:BYTE PTR[BX],AL =4398 07 POP ES =4399 C606116000 MOV SYSTMFLG,0 ; CLOCK BUSY******************************* = ;* * = ;* FNC : * = ;*  ; JMP IF NOT READ =4356 53 PUSH BX ; =4357 BBA566 MOV BX,OFFSET YYWORK ; DX = YY WORK AREA ADDR =435A B400 MOV AH,0 ; AH = 00 :READ =  FLAG OFF =439E E93600 43D7 JMP SCL600 ; IF GET = ;* =43A1 53 SCL500: PUSH BX =43A2 8BF3 MOV SI,BX ; =43A4 46 INC SI =43A 1) SET/GET CALENDAR & CLOCK * = ;* * = ;****************************************************************** ;***** YY (YEAR) DATA READ PROC. ******************************* =435C E87900 43D8 CALL SCL800 ; YY READ TO SYS.WORK =435F E8A300 4405 CALL YYBCD ; YY BCD <-- JIS8 =4362 5B  5 BFAB66 MOV DI,OFFSET CLKWK4 =43A8 B90500 MOV CX,5 =43AB 1E PUSH DS =43AC 8E1E1D66 MOV DS,INT_DS ; USER AREA DATA SEG. =43B0 FC SCL550: C ;* * = ;* OUT : CX,BP; BREAK * = ;*  PAGE 128 = ;***** YY BCD <-- JIS8 *********************************************** =4405 51 YYBCD: PUSH CX =4406 50 PUSH AX =4407 8B07 MOV AX,[BX] LD =43B1 AC LODS BYTE PTR [SI] =43B2 FD STD =43B3 AA STOS BYTE PTR [DI] =43B4 E2FA 43B0 LOOP SCL550 =43B6 FC CLD =43B7 1F  * = ;********************************************************************** = ;* =43D8 8B0F SCL800: MOV CX,[BX] ; CX; YY DATA FROM SYS.WORK =43DA 1E ; =4409 86E0 XCHG AH,AL ; =440B B104 MOV CL,4 =440D D2E4 SHL AH,CL ; =440F 240F AND AL,0FH ; =4411 0AE0  POP DS =43B8 FE0EAB66 DEC CLKWK4 =43BC 55 PUSH BP =43BD BBA766 MOV BX,OFFSET CLKWK0 =43C0 E87D00 4440 CALL PSCLKW ; CLOCK WRITE RTN. =43C3  PUSH DS ; =43DB 53 PUSH BX ; =43DC 50 PUSH AX =43DD B800A0 MOV AX,0A000H ; =43E0 8ED8 MOV DS,AX  OR AH,AL ; =4413 8826A466 MOV YYSAVE,AH ; =4417 58 POP AX =4418 59 POP CX =4419 C3 RET = ;* =5D POP BP =43C4 5B POP BX = ;* =43C5 E85200 441A CALL YYJIS8 ; YY JIS8 <-- BCD =43C8 53 PUSH BX ; =43C9 BBA566 ; DS = C-MOS ADDR =43E2 58 POP AX =43E3 BB0001 MOV BX,0100H ; DS,BX; P.YY DATA AREA =43E6 0AE4 OR AH,AH ; CHK YY READ/WRITE F. =43E8 7510 43FA  ;***** YY JIS8 <-- BCD *********************************************** =441A 51 YYJIS8: PUSH CX =441B 50 PUSH AX =441C 1E PUSH DS =441D 8E1E1D66  MOV BX,OFFSET YYWORK ; DX = YY WORK AREA ADDR CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 127 = ;* =  JNZ SCL870 ; JMP IF WRITE = ;* = ;***** YY DATA READ FROM C-MOS MEM. ******************************* = ;* =43EA 8B0F MOV CX,[BX] ; CX MOV DS,INT_DS =4421 8A07 MOV AL,BYTE PTR [BX] =4423 1F POP DS =4424 A2A466 MOV YYSAVE,AL =4427 B400 MOV AH,0 =4429 B104 MO ;***** YY (YEAR) DATA WRITE PROC. ******************************* = ;* =43CC B401 MOV AH,1 =43CE E80700 43D8 CALL SCL800 ; YY WRITE TO C-MOS MEM. =43D1 5B ; YY DATA =43EC 5B SCL820: POP BX =43ED 1F POP DS =43EE 0AE4 OR AH,AH ; CHK YY READ/WRITE F. =43F0 7502 43F4 JNZ SCL850 ; JMP IF WRITE =43F2V CL,4 =442B D3E0 SHL AX,CL =442D 80CC30 OR AH,30H =4430 D2E8 SHR AL,CL =4432 0C30 OR AL,30H =4434 86E0 XCHG AH,AL =4436 A POP BX ; =43D2 C606116002 MOV SYSTMFLG,2 ; CLOCK REWRITING FLAG ON = ;* = ;***** END PROC. *********************************************** =  890F MOV [BX],CX ; STORE YY DATA =43F4 C606A36601 SCL850: MOV YYFLG,1 ; SET YY READ F. =43F9 C3 RET = ;* = ;***** YY DATA WRITE TO 3A566 MOV YYWORK,AX =4439 58 POP AX =443A 59 POP CX =443B C3 RET = ;* = ;***** CLOCK READ ROUTINE *** ;* = SCL600: =43D7 C3 RET = ;* = ;***** SUB-ROUTINE *********************************************** = ;* C-MOS MEM. ******************************* = ;* = SCL870: =43FA E80401 4501 CALL PSCMSE ; C-MOS ENABLE =43FD 890F MOV [BX],CX ; STORE YY DATA =4************************************ = ;* =443C F9 PSCLKR: STC ; READ =443D E90100 4441 JMP SCW100 = ;***** CLOCK WRITE ROUTINE ********************** * = ;* IN : DS,BX; SYS.WORK * = ;* AH; 00H/01H; READ/WRITE * = 3FF E80601 4508 CALL PSCMSD ; C-MOS DISABLE =4402 E9E7FF 43EC JMP SCL820 = ;* CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1  ***************** =4440 F8 PSCLKW: CLC ; WRITE =4441 56 SCW100: PUSH SI =4442 BE0200 MOV SI,2 ; SI; COUNTER (CNTO) =4445 52 PUSH DX =4446 1) =447B 75D9 4456 JNZ SCW200 ; JMP IF CNT0 NE 0 =447D B108 MOV CL,8 ; CNT1 = 8 =447F E9D6FF 4458 JMP SCW250 = ;* =4482 B002 SCW500:  PUSH AX =44BA EC IN AL,DX ; DATA READ (1BIT) =44BB D0E8 SHR AL,1 ; CF; READ DATA =44BD D1DD RCR BP,1 ; BP; READ DATA =4BA5800 MOV DX,0058H ; DX; I/O PORT# =4449 53 PUSH BX =444A 803EA26600 CMP RWFLG,0 ; READ ? =444F 7444 4495 JE SCR100 ; JMP IF READ = MOV AL,02H =4484 E85B00 44E2 CALL PSCLKS ; TIME SET AND COUNTER HOLD =4487 2AC0 SUB AL,AL =4489 E85600 44E2 CALL PSCLKS ; REGISTER HOLD =448C C606816000 4BF 58 POP AX =44C0 24EF AND AL,0EFH =44C2 EE OUT DX,AL ; CLK; 0 =44C3 56 PUSH SI ; TIMER = 5 (MS) =44C4 5E  ;***** CLOCK WRITE PRIC. *************************************** =4451 B001 MOV AL,01H =4453 E88C00 44E2 CALL PSCLKS ; REGISTER SHIFT =4456 B110 SCW200: MOV CL,16 MOV SYSTMCHK,0 ; TIMER COUNTER CLEAR =4491 5B SCW700: POP BX =4492 5A POP DX =4493 5E POP SI =4494 C3 RET = ;***** C POP SI =44C5 56 PUSH SI =44C6 5E POP SI =44C7 9D POPF =44C8 90 NOP =44C9 E2E5 44B0 LOOP SCR300 ; JMP IF CNT1 NE 0 ; CX; COUNTER (CNT1) =4458 8B2F SCW250: MOV BP,[BX] ; BP; WRITE DATA CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 129 =445A 8AE5 SLOCK READ PROC. *************************************** =4495 B003 SCR100: MOV AL,03H =4497 E84800 44E2 CALL PSCLKS ; TIME READ =449A B001 MOV AL,01H =449C E84B00 44EA  =44CB 4E DEC SI ; DEC.CNT0 =44CC 780D 44DB JS SCR500 ; SET READ DATA INTO WORK =44CE 892F MOV [BX],BP ; SET READ DATA INTO WORK =44D0 43 CW300: MOV AH,CH ; AH; 00H =445C D1ED SHR BP,1 ; CF; WRITE DATA (1BIT) =445E D0DC RCR AH,1 =4460 D0EC SHR AH,1 =4462 D0EC SHR A CALL PSCLKE ; REGISTER SHIFT =449F 9C PUSHF =44A0 FA CLI =44A1 50 PUSH AX =44A2 EC IN AL,DX ; AL; LSB (SEC.) =44A3 D0E8  INC BX =44D1 43 INC BX =44D2 0BF6 OR SI,SI =44D4 75D8 44AE JNZ SCR200 ; JMP IF CNT0 NE 0 =44D6 B108 MOV CL,8 H,1 =4464 0AC4 OR AL,AH ; AL; WRITE DATA (1BIT) =4466 9C PUSHF =4467 FA CLI =4468 EE OUT DX,AL ; DI SET =4469 0C10  SHR AL,1 ; CF; READ DATA (1BIT) =44A5 D1DD RCR BP,1 ; BP; READ DATA =44A7 58 POP AX =44A8 B10F MOV CL,15 ; CL; COUNTER (C ; CNT1 = 8 =44D8 E9D5FF 44B0 JMP SCR300 = ;* =44DB 8BC5 SCR500: MOV AX,BP ; AH; READ DATA =44DD 8827 MOV [BX],AH ; SET READ DATA INTO WORK =44D OR AL,10H =446B EE OUT DX,AL ; CLK; 1, 1BIT WRITE =446C 56 PUSH SI ; TIMER = 2 (MS) =446D 5E POP SI =446E 24EF NT1) =44AA 9D POPF =44AB E90200 44B0 JMP SCR300 = SCR200: =44AE B110 MOV CL,16 ; CL; COUNTER (CNT1) CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized BasF E9AFFF 4491 JMP SCW700 = ;* = ;***** COMMAND SET SUB-ROUTINE ******************************* = ;* = PSCLKS: =44E2 9C  AND AL,0EFH =4470 EE OUT DX,AL ; CLK; 0 =4471 2407 AND AL,07H ; RESET DI =4473 9D POPF =4474 E2E4 445A LOOP SCW300 ; JMic I/O System V1 PAGE 130 = SCR300: =44B0 9C PUSHF =44B1 FA CLI =44B2 0C10 OR AL,10H =44B4 EE  PUSHF =44E3 FA CLI =44E4 B90100 MOV CX,1 ; TIMER COUNT = 1 (5MS) =44E7 E90500 44EF JMP SCS100 = PSCLKE: =44EA 9C PUP IF CNT1 NE 0 =4476 43 INC BX =4477 43 INC BX =4478 4E DEC SI ; DEC.CNT0 =4479 7807 4482 JS SCW500 ; JMP IF WRITE END (CNT0 = - OUT DX,AL ; CLK; 1 =44B5 56 PUSH SI ; TIMER = 5 (MS) =44B6 5E POP SI =44B7 56 PUSH SI =44B8 5E POP SI =44B9 50  SHF =44EB FA CLI =44EC B90600 MOV CX,6 ; TIMER COUNT = 6 (40MS) =44EF EE SCS100: OUT DX,AL ; OUT CMD =44F0 52 PUSH DX =44F1 5A  ;* * = ;********************************************************************** = ;* =4508 50 PSCMSD: PUSH AX =4 * = ;********************************************************************** = ;* = MELODY: =450F 8916C266 MOV LMIDPT,D POP DX =44F2 0C08 OR AL,08H ; STB; 1 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 131 =44F4 EE OUT DX,509 2BC0 SUB AX,AX =450B E659 OUT 59H,AL ; DISABLE =450D 58 POP AX =450E C3 RET = ;* = ;**********X =4513 A3C666 MOV LMIDLN,AX ; DATA AREA LENGTH SAVE =4516 890EBE66 MOV LMICMD,CX ; COMMAND CODE =451A A11D66 MOV AX,INT_DS =451D A3C466 MOV LMIDPT+2,AL ; WRITE CMD =44F5 52 SCS500: PUSH DX ; TIMER =44F6 5A POP DX =44F7 E2FC 44F5 LOOP SCS500 =44F9 90 NOP =44FA 2407 AND ************************************************************ = ;* * = ;* DATA AREA * AX =4520 E80100 4524 LMA010: CALL MLCMD ; COMMAND PROCESS = ;* =4523 C3 RET ; = ;* = ;************************************* AL,07H ; STB; 0 =44FC EE OUT DX,AL ; STB CLEAR =44FD 52 PUSH DX =44FE 5A POP DX =44FF 9D POPF =4500 C3 = ;* * = ;********************************************************************** = ;* = DS********************************* = ;* * = ;* COMMAND PROCESS * = ;*  RET CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 132 = EJECT = ;* = ;**********************************EG $ =66A2 00 RWFLG DB 0 ; SAVE SET/GET = ;***** WORK AREA *********************************************** =66A3 00 YYFLG DB 0 ; YY READ FLAG =66A * = ;********************************************************************** = ;* = MLCMD: =4524 FC ************************************ = ;* * = ;* C-MOS ACCESS ENABLE * = 4 00 YYSAVE DB 0 ; YY (BCD) =66A5 0000 YYWORK DW 0 ; YY (JIS8) =66A7 00 CLKWK0 DB 0 =66A8 00 DB 0 =66A9 00 DB  CLD ; CLEAR DIRECTION FLAG =4525 C606D36600 MOV MLWFLG,00H ; CLEAR FLAG =452A A1BE66 MOV AX,LMICMD ; COMMAND CODE =452D 3C02 CMP AL,02H ; =452;* * = ;********************************************************************** = ;* =4501 50 PSCMSE: PUSH AX =4502 B001  0 =66AA 00 DB 0 =66AB 00 CLKWK4 DB 0 =66AC 00 DB 0 END = INCLUDE MELODY.LIB CP/M ASM86 1.1 SOURCE: USCBIOSF 7506 4537 JNE MLC010 ; IF NOT SET MELODY COMMAND =4531 E80B00 453F CALL MLSETM ; SET MELODY COMMAND =4534 E90700 453E JMP MLC030 ; =4537 3C03 MLC010: CMP  MOV AL,01H =4504 E659 OUT 59H,AL ; ENABLE =4506 58 POP AX =4507 C3 RET = ;* = ;**********************.A86 Customized Basic I/O System V1 PAGE 133 = EJECT = CSEG $ = ;********************************************************* AL,03H ; =4539 7503 453E JNE MLC030 ; IF NOT BUZZER1 COMMAND =453B E8E600 4624 CALL MLBUZ1 ; BUZZER1 COMMAND = MLC030: =453E C3 RET = ************************************************ = ;* * = ;* C-MOS ACCESS DISABLE * = ************* = ;* * = ;* MELODY MAIN ROUTINE * = ;*   ;* = ;********************************************************************** = ;* * = ;* SET MELODY80 ;IF NOT 'T' =457B E32C 45A9 JCXZ LSE095 ; RETURN IF DATA END =457D 26AC LODS ES:BYTE PTR [SI] ; =457F 49 DEC CX ; =4580 041F ; =45BA 3C47 CMP AL,47H ; =45BC 7609 45C7 JBE LSE130 ; IF AL = A--G =45BE 3C4E CMP AL,4EH ; =45C0 75B2 4574 JNZ LSE045 ; IF NO COMMAND * = ;* * = ;********************************************************************** =  ADD AL,1FH ; =4582 3C50 CMP AL,50H ; =4584 7204 458A JB LSE060 ; =4586 3C53 CMP AL,53H ; =4588 7602 458C JBE LSE070 T 'N' =45C2 B030 MOV AL,30H ; =45C4 E90D00 45D4 JMP LSE135 ; =45C7 240F LSE130: AND AL,0FH ; =45C9 48 DEC AX ; =45CA BBAD66  ;* =453F 8B36C266 MLSETM: MOV SI,LMIDPT ; DATA AREA POINTER =4543 8E06C466 MOV ES,LMIDPT+2 =4547 8B0EC666 MOV CX,LMIDLN ; DATA LENGTH =454B E35C 45A9 LSE010: JC ; =458A B050 LSE060: MOV AL,50H ; =458C E9DBFF 456A LSE070: JMP LSE040 ; = ;* =458F 2BD2 LSE080: SUB DX,DX ; 0 CLEAR DX =4591 3C53  MOV BX,OFFSET MLTBL1 =45CD D7 XLAT BX ; GET NOTE BITS =45CE 02C6 ADD AL,DH ; =45D0 3C1E CMP AL,1EH ; =45D2 73D6 XZ LSE095 ; RETURN IF DATA END =454D 26AC LSE020: LODS ES:BYTE PTR [SI] ; =454F C606C86631 MOV MLWPCB,31H ; SET 1ST COMMAND (CONTROL) =4554 49 DEC CX ; = CMP AL,53H ; =4593 7507 459C JNZ LSE090 ; IF NOT 'S' =4595 E312 45A9 JCXZ LSE095 ; RETUURN IF DATA END =4597 B210 MOV DL,10H ; =4599 26AC  45AA JAE LSE096 ; =45D4 A2C866 LSE135: MOV MLWPCB,AL ; SET 1ST COMMAND (MELODY) =45D7 E32F 4608 JCXZ LSE150 ; IF DATA END =45D9 3C30 CMP AL,30H 4555 3C4D CMP AL,4DH ; CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 134 =4557 751E 4577 JNZ LSE050 ; IF NOT 'M' =455 LODS ES:BYTE PTR [SI] ; =459B 49 DEC CX ; =459C 3C2B LSE090: CMP AL,2BH ; =459E 740F 45AF JZ LSE100 ; IF '+' =45A0 3C2D  ; =45DB 7419 45F6 JZ LSE137 ; IF 'N' =45DD 2AC6 SUB AL,DH ; =45DF 3C05 CMP AL,05H ; =45E1 7413 45F6 JZ LSE137 ; IF 'E' =49 E34E 45A9 JCXZ LSE095 ; RETURN IF DATA END =455B 26AC LODS ES:BYTE PTR [SI] =455D 49 DEC CX ; =455E 0410 ADD AL,10H ; =4560  CMP AL,2DH ; =45A2 740D 45B1 JZ LSE110 ; IF '-' =45A4 B60C MOV DH,0CH ; =45A6 E90D00 45B6 JMP LSE120 ; = ;* =45A9 C5E3 3C0C CMP AL,0CH ; =45E5 740F 45F6 JZ LSE137 ; IF 'B' =45E7 268A04 MOV AL,ES:BYTE PTR [SI] ; =45EA 3C23 CMP AL,23H ; 3C41 CMP AL,41H ; =4562 7204 4568 JB LSE030 ; =4564 3C43 CMP AL,43H ; =4566 7602 456A JBE LSE040 ; =4568 B042 LS3 LSE095: RET ; = ;* =45AA 4E LSE096: DEC SI ; =45AB 41 INC CX ; =45AC E99EFF 454D JMP LSE020 ;  =45EC 750B 45F9 JNZ LSE140 ; IF NOT '#' =45EE FE06C866 INC MLWPCB ; =45F2 46 INC SI ; =45F3 49 DEC CX ; =45F4 E3E030: MOV AL,42H ; =456A A2C966 LSE040: MOV MLWPCB+1,AL ; SET 2ND COMMAND (CONTROL) =456D B202 MOV DL,02H ; NUMBER OF PARAMETERS =456F E87A01 46EC CALL MLOUT ;  = ;* =45AF B618 LSE100: MOV DH,18H ; =45B1 E3F6 45A9 LSE110: JCXZ LSE095 ; =45B3 26AC LODS ES:BYTE PTR [SI] ; =45B5 49 DEC CX12 4608 JCXZ LSE150 ; IF DATA END = LSE137: ; =45F6 268A04 MOV AL,ES:BYTE PTR [SI] ; =45F9 3C30 LSE140: CMP AL,30H ; OUT CONTROL COMMAND =4572 7535 45A9 JNZ LSE095 ; RETURN IF ALM =4574 E9D4FF 454B LSE045: JMP LSE010 ; =4577 3C54 LSE050: CMP AL,54H ; =4579 7514 458F JNZ LSE0 ; CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 135 =45B6 3C41 LSE120: CMP AL,41H ; =45B8 72F7 45B1 JB LSE110  =45FB 720B 4608 JB LSE150 ; IF NOTE LENGTH OMITTED =45FD 3C39 CMP AL,39H ; =45FF 7707 4608 JA LSE150 ; IF NOTE LENGTH OMITTED =4601 46 IZ LBU085 ; RETURN IF DATA END =4632 26AC LODS ES:BYTE PTR [SI] ; =4634 49 DEC CX ; =4635 B230 MOV DL,30H ; =4637 3C42  468E LBU080: JCXZ LBU090 ; IF DATA END =467B 268A04 MOV AL,ES:BYTE PTR[SI] =467E 3C30 CMP AL,30H ; =4680 720C 468E JB LBU090 ; IF LENGTH OMITTED NC SI ; =4602 49 DEC CX ; =4603 240F AND AL,0FH ; =4605 E90300 460B JMP LSE160 ; =4608 A0D166 LSE150: MOV AL,MLWK02  CMP AL,42H ; =4639 7406 4641 JZ LBU020 ; IF 'B' =463B 3C50 CMP AL,50H ; =463D B240 MOV DL,40H ; =463F 7523 4664 JN =4682 3C39 CMP AL,39H ; CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 138 =4684 7708 468E JA LBU090 ; IF LENGTH OMIT ; =460B A2D166 LSE160: MOV MLWK02,AL ; =460E BBB466 MOV BX,OFFSET MLTBL2 ; =4611 D7 XLAT BX ; =4612 0AC2 OR AL,DL ; =4614 Z LBU050 ; IF NOT 'P' =4641 E34A 468D LBU020: JCXZ LBU085 ; RETURN IF DATA END =4643 C606C86631 MOV MLWPCB,31H ; SET 1ST COMMAND (CONTROL) =4648 26AC LODS ES:BYTE PTR [SI] TED =4686 46 INC SI ; =4687 43 INC BX ; =4688 49 DEC CX ; =4689 E9EDFF 4679 JMP LBU080 ; = A2C966 MOV MLWPCB+1,AL ; SET 2ND COMMAND =4617 B202 MOV DL,02H ; NUMBER OF PARAMETERS =4619 E8D000 46EC CALL MLOUT ; OUT NOTE COMMAND =461C 7505 4623  ; =464A 49 DEC CX ; =464B 3C31 CMP AL,31H ; =464D 7204 4653 JB LBU030 ; =464F 3C33 CMP AL,33H ; =4651 7602 ;* =468C 59 LBU084: POP CX ; =468D C3 LBU085: RET ; = ;* =468E 80CA38 LBU090: OR DL,38H ; =4691 8816C866 MOV  JNZ LSE180 ; RETURN IF ALM =461E E303 4623 JCXZ LSE180 ; RETURN IF DATA END =4620 E92AFF 454D LSE170: JMP LSE020 ; CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1  4655 JBE LBU040 ; =4653 B032 LBU030: MOV AL,32H ; =4655 02C2 LBU040: ADD AL,DL ; =4657 A2C966 MOV MLWPCB+1,AL ; SET 2ND COMMAND (CONTROL) =465 MLWPCB,DL ; SET BUZZER COMMAND =4695 51 PUSH CX ; =4696 800ED36602 OR MLWFLG,02H ; SET C-F =469B 23DB AND BX,BX ; =469D 7415 46B4  PAGE 136 =4623 C3 LSE180: RET ; CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 137 = A B202 MOV DL,02H ; NUMBER OF PARAMETERS =465C E88D00 46EC CALL MLOUT ; OUT CONTROL COMMAND =465F 752C 468D JNZ LBU085 ; RETURN IF ALM =4661 E9CCFF 4630  JZ LBU095 ; IF LENGTH OMITTED =469F 8026D366FD AND MLWFLG,0FDH ; CLEAR C-F =46A4 8ACB MOV CL,BL =46A6 F7DB NEG BX ; =46A8 8D18 LEA EJECT = ;********************************************************************** = ;* * = ;* BUZZER1 COMMAND  JMP LBU010 ; = ;* =4664 3C48 LBU050: CMP AL,48H ; =4666 7204 466C JB LBU060 ; =4668 3C4B CMP AL,4BH ; =466A 7608 4 BX,[SI+BX] ; =46AA E86A00 4717 CALL PMEDECBIN ; DECIMAL TO BINARY =46AD 8BCA MOV CX,DX ; =46AF 83F902 CMP CX,0002H ; =46B2 7605 46B9 JBE  * = ;* * = ;********************************************************************** = 674 JBE LBU070 ; =466C E31F 468D LBU060: JCXZ LBU085 ; RETURN IF DATA END =466E 26AC LODS ES:BYTE PTR [SI] ; =4670 49 DEC CX =4671 E9F0FF 4664  LBU100 ; IF 20MS =46B4 800EC86604 LBU095: OR MLWPCB,04H ; =46B9 B201 LBU100: MOV DL,01H ; NUMBER OF PARAMETERS =46BB E82E00 46EC CALL MLOUT ; OUT BUZZER COMMAND =46BE 75C ;* =4624 8B36C266 MLBUZ1: MOV SI,LMIDPT ; DATA AREA POINTER =4628 8E06C466 MOV ES,LMIDPT+2 ; =462C 8B0EC666 MOV CX,LMIDLN ; DATA LENGTH =4630 E35B 468D LBU010: JCX JMP LBU050 = ;* =4674 2C48 LBU070: SUB AL,48H ; =4676 92 XCHG AX,DX ; AL--> DL =4677 2BDB SUB BX,BX ; SET BX TO 0 =4679 E313 C 468C JNZ LBU084 ; RETURN IF ALM =46C0 F606C86604 TEST MLWPCB,04H ; =46C5 7417 46DE JZ LBU120 ; IF 20MS COMMAND END =46C7 F606D36602 TEST MLWFLG,02H  ;********************************************************************** = ;* * = ;* NOTE LENGTH CONSTANT TABLE ******************************************************************* = ;* =46EC BFC866 MLOUT: MOV DI,OFFSET MLWPCB ; POINTER TO PARAMETER AREA =46EF B602 LOU010: MOV DH,02H ; =46F1 E460  ; =46CC 7510 46DE JNZ LBU120 ; IF C-F ON =46CE 83E903 SUB CX,0003H ; =46D1 E303 46D6 JCXZ LBU110 ; IF WAIT TIME IS 30MS =46D3 E86C00 4742 CALL PMW * = ;* * = ;********************************************************************** = ;* =66B4 40  LOU020: IN AL,60H ; =46F3 93 XCHG AX,BX ; AL -> BL =46F4 E460 IN AL,60H ; CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 AIT ; WAIT =46D6 8026C866FB LBU110: AND MLWPCB,0FBH ; SET 20MS COMMAND =46DB E9DBFF 46B9 JMP LBU100 ; =46DE 59 LBU120: POP CX ; =46DF E3AC 468D JCXZ L MLTBL2 DB 40H ; 1 =66B5 49 DB 49H ; .1/2 =66B6 41 DB 41H ; 1/2 =66B7 4A DB 4AH ; .1/4 =66B8 42  PAGE 140 =46F6 3AC3 CMP AL,BL ; =46F8 740C 4706 JZ LOU030 ; IF STATUS MATCH =46FA FECE DEC DH ; =46FC 75F3 46F1BU085 ; RETURN IF DATA END =46E1 51 PUSH CX ; =46E2 B90700 MOV CX,0007H ; =46E5 E85A00 4742 CALL PMWAIT ; WAIT =46E8 59 POP  DB 42H ; 1/4 =66B9 4B DB 4BH ; .1/8 =66BA 43 DB 43H ; 1/8 =66BB 4C DB 4CH ; .1/16 =66BC 44  JNZ LOU020 ; =46FE 42 INC DX ; CLEAR ZERO FLAG =46FF C706C0660810 MOV LMIIOS,1008H ; SET IOS (AT3,ALM) =4705 C3 RET = ;* =47 CX ; =46E9 E944FF 4630 JMP LBU010 ; CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 139 = EJECT =  DB 44H ; 1/16 =66BD 45 DB 45H ; 1/32 = ;* = CSEG $ = ;**********************************************06 3C80 LOU030: CMP AL,80H ; =4708 7403 470D JZ LOU040 ; IF READY =470A E9E2FF 46EF JMP LOU010 ; = ;* =470D 8A05 LOU040: MOV AL,DS DSEG $ = ;********************************************************************** = ;* * = ;* ************************ = ;* * = ;* OUT COMMAND BY SPECIFIED NUMBER OF BYTES * = ;* :BYTE PTR [DI] ; =470F E660 OUT 60H,AL ; OUT 1 PARAMETER BYTE =4711 47 INC DI ; =4712 FECA DEC DL ; =4714 75D9 46EF  NOTE CONSTANT TABLE * = ;* * = ;******************************************************************** * = ;* INPUT PARAMETERS : * = ;* REG.DL : NUMBER OF PARAMETER BYTES * = JNZ LOU010 ; IF NOT END =4716 C3 RET ; = ;* = ;********************************************************************** = ;* ** = ;* =66AD 0A MLTBL1 DB 0AH ; -A =66AE 0C DB 0CH ; -B =66AF 01 DB 01H ; -C =66B0 03 DB  ;* * = ;* RETURNED VALUE : * = ;* ZERO FLAG : ON * = ;* DECIMAL TO BINARY ROUTINE * = ;*  03H ; -D =66B1 05 DB 05H ; -E =66B2 06 DB 06H ; -F =66B3 08 DB 08H ; -G = ;* =  / NORMAL * = ;* OFF / ALM * = ;* * = ;***  * = ;********************************************************************** = ;* = PMEDECBIN: =4717 50 PUSH AX =4718 2BD2 SUB DX,DX  = ;* = PMWAIT: =4742 51 PUSH CX ; =4743 B9000C MOV CX,0C00H ; SET 10MS WAIT COUNT =4746 E2FE 4746 PMW010: LOOP PMW010 MELODY SPEED =66D1 04 MLWK02 DB 04H ; NOTE LENGTH =66D2 00 MLWK03 DB 00H ; NOTE LENGTH (FOR WAITING) =66D3 00 MLWFLG DB 00H ; FLAG =66D4 0000  =471A 8AEE MOV CH,DH ; CX; DECIMAL DATA LL. =471C 268A07 SDE100: MOV AL,ES:BYTE PTR [BX] ; AL; DECIMAL DATA =471F 240F AND AL,0FH =4721 51 PUSH CX  ; 10MS WAIT =4748 59 POP CX ; =4749 E2F7 4742 LOOP PMWAIT ; =474B C3 RET ; CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O Sys PSWK0 DW 0 =66D6 0000 DW 0 =66D8 0000 DW 0 =66DA 0000 DW 0 =66DC 0000 DW 0 =66DE 0000 DW 0 =66E0 0000  ; ESCAPE DATA LL. = ;* =4722 D1E2 SHL DX,1 ; *2 =4724 7214 473A JB SDE300 ; JMP IF ERR. =4726 8BCA MOV CX,DX =4728 D1E2 tem V1 PAGE 142 = EJECT = DSEG $ = ;* = ;************************************************************ DW 0 END = INCLUDE RS232CIO.LIB CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 143 =  SHL DX,1 ; *4 =472A 720E 473A JB SDE300 ; JMP IF ERR. =472C D1E2 SHL DX,1 ; *8 =472E 720A 473A JB SDE300 ; JMP IF ERR. =4730 ********** = ;* * = ;* DATA AREA * = ;*  EJECT = ; 12/24/'82 = CSEG $ = ;********************************************************************** = ;* 03D1 ADD DX,CX ; *10 =4732 7206 473A JB SDE300 ; JMP IF ERR. = ;* =4734 8AC8 MOV CL,AL =4736 2AED SUB CH,CH =4738  * = ;********************************************************************** = ;* =66BE 0000 LMICMD DW 0000H ; COMMAND CODE , FLAG =66C0 * = ;* RS232C INITIALIZE PROCESS * = ;* * = 03D1 ADD DX,CX = ;* =473A 59 SDE300: POP CX =473B 7203 4740 JB SDE500 ; JMP IF ERR.(OVERFLOW) =473D 43 INC BX =473E E2DC  0000 LMIIOS DW 0000H ; IOS1 , IOS2 =66C2 0000 LMIDPT DW 0000H ; DATA AREA POINTER (OFFSET) =66C4 0000 DW 0000H ; (SEGMENT) =66C6 0000  ;* INPUT CL = CHANNEL SELECT ( A:) * = ;* DL = INITIALIZE PARAMETER * = ;* DH = BAUD RATE  471C LOOP SDE100 =4740 58 SDE500: POP AX CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 141 =4741 C3 RET ;  LMIDLN DW 0000H ; DATA AREA LENGTH = ;* = ;*** WORKING AREA = ;* =66C8 31 MLWPCB DB 31H ; 1ST COMMAND =66C9 42  * = ;* * = ;********************************************************************** = RS232_INIT: =474C 8B16236 = ;* = ;********************************************************************** = ;* * = ;* W DB 42H ; 2ND COMMAND =66CA 31 DB 31H ; =66CB 50 DB 50H ; =66CC 31 DB 31H ; =66CD 62 DB 6 MOV DX,INT_DX ; SET INIT PARAM =4750 8AC2 MOV AL,DL ; AL = INPUT PARAM (MODE BYTE) =4752 2AE4 SUB AH,AH ; SET FNC.CODE (INITIALIZE)AIT ROUTINE * = ;* * = ;********************************************************************** 62H ; = ;* =66CE 00 MLWPBZ DB 00H ; =66CF 00 DB 00H ; = ;* =66D0 50 MLWK01 DB 50H ;    =4754 E83100 4788 CALL RS232_IO ; RS232C I/O ROUTINE =4757 C3 RET = = = ;********************************************************************** = ;*  * = ;********************************************************************** = READER: =476E 52 PUSH DX =476F 50 PUSH AX  * = ;* 7 6 5 4 3 2 1 0 * = ;* -STOP BIT- PARITY PARITY WORD LENGTH - BAUD RATE - * = ;  * = ;* PUNCH (PUNCH DEVICE OUTPUT) * = ;*  ; REGISTOR SAVE CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 144 = READER00: =4770 B402 MOV AH,02H ; SE ENABLE * = ;* 0 1 = 1 1= EVEN 1= ENABLE 0 0 = 5 0 1 = *1 * = ;* 1 1 = 2 0= ODD 0= DESABLE 0 1 = 6  * = ;* INPUT CL=SEND CHARACTOR * = ;* * = ;******************************T FNC.CODE (RECV CHARA) =4772 E81300 4788 CALL RS232_IO ; RS232C I/O ROUTINE =4775 8AD0 MOV DL,AL ; SAVE RECV CHARACTOR =4777 F6C480 TEST AH,80H =477A 7407* = ;* 1 0 = 7 * = ;* 1 1 = 8 * = ;* **************************************** = PUNCH: =4758 50 PUSH AX ; REGISTOR SAVE = PUNCH00: =4759 8AC1 MOV AL,CL ; S 4783 JZ READER10 ; IF NOT TIME OUT =477C E843E3 2AC2 CALL CONST ; KEYIN CHECK =477F 0AC0 OR AL,AL =4781 74ED 4770 JZ READER00  * = ;* * = ;* AH=1 SEND THE CHARACTOR * = ET SEND CHARACTOR =475B B401 MOV AH,01H ; SET FNC.CODE (SEND CHARA) =475D E82800 4788 CALL RS232_IO ; RS232C I/O ROUTINE =4760 F6C480 TEST AH,80H =4763 7407 ; IF NOT KEYIN = READER10: =4783 58 POP AX =4784 8AC2 MOV AL,DL ; RESTORE RECV CHARACTOR =4786 5A POP DX ;* * = ;* INPUT AL=SEND CHARACTOR * = ;* OUTPUT AH=STATUS 1  476C JZ PUNCH10 ; IF NOT TIME OUT =4765 E85AE3 2AC2 CALL CONST ; KEYIN CHECK =4768 0AC0 OR AL,AL =476A 74ED 4759 JZ PUNCH0; REGISTOR RESTORE =4787 C3 RET = ; = ;********************************************************************** = ;*  * = ;* * = ;* AH=2 RECEIVE A CHARACTOR * = ;* 0 ; IF NOT KEYIN = PUNCH10: =476C 58 POP AX ; REGISTOR RESTORE =476D C3 RET = ; = ;*************** * = ;* RS232C I/O ROUTINE * = ;* * = ;*  * = ;* OUTPUT AL=RECEIVE CHARACTOR * = ;* AH=STATUS 1 * = ******************************************************* = ;* * = ;* READER (READER DEVICE INPUT) * =  INPUT AH=FUNCTION CODE * = ;* * = ;* AH=0 INITITIALIZE COMMUNICATION PORT * =  ;* * = ;* AH=3 RETURN THE COMMAND STATUS * = ;*  ;* * = ;* OUTPUT AL=RECV CHARACTOR * = ;*  ;* * = ;* INPUT AL=PARAMETER FOR INITIALIZATION * = ;*    * = ;* OUTPUT AH=STATUS 1 * = ;* BIT 7 = TIME OUT * = ;*  ; = 0032 RSIM EQU 32H ; MODE SET = 0032 RSIC EQU 32H ; COMMAND SET = 0032 RSIS EQU 32H ; STATUS READ = 001 CMP AH,01H =4792 7449 47DD JZ RSSN00 ; IF AH=1 (SEND CHARACTOR) =4794 80FC02 CMP AH,02H =4797 7503 479C JNZ RS232_00 =4799 E97700  6 = BREAK DETECT * = ;* 5 = FRAMING ERROR * = ;* 4 = OVERRUN ERROR * = 030 RSIR EQU 30H ; RECV DATA READ = 0030 RSIW EQU 30H ; SEND DATA WRITE = 002B RSCS EQU 2BH ; COUNTER SET = 002F  4813 JMP RSRV00 ; IF AH=2 (RECV CHARACTOR) = RS232_00: =479C 80FC03 CMP AH,03H =479F 7503 47A4 JNZ RS232_RET =47A1 E99700 483B JMP RSSR00  ;* 3 = PARITY ERROR * CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 145 = ;*  RSCM EQU 2FH ; COUNTER MODE SET = 0034 RSMK EQU 34H ; MASK SET = 0034 RSRS EQU 34H ; READ MODEM SIGNAL = 0036  ; IF AH=3 (STATUS READ) = RS232_RET: =47A4 5A POP DX ; REGISTOR RESTORE =47A5 59 POP CX =47A6 5B POP BX =47A7 C 2 = TRANSMITTER EMPTY * = ;* 1 = RECEIVER READY * = ;* 0 = TRANSMITTER READY * =  RSWS EQU 36H ; WRITE LINE CLOSE = ; = ;***** BAUD RATE TABLE ***** = ; = DSEG $ =66E2 0004 BAUD_TBL 3 RET = ; = ;***** INITIALIZE COMMUNICATION PORT ***** = ; = RSIN00: =47A8 8BC8 MOV CX,AX ; SAV ;* * = ;* AL=STATUS 2 * = ;* BIT 7 = MODEM DW 0400H ; 150 BAUD =66E4 0003 DW 0300H ; 200 =66E6 0002 DW 0200H ; 300 =66E8 0001 DW 0100H ; 600 =66EAE INIT PARM =47AA B007 MOV AL,07H =47AC E634 OUT RSMK,AL ; MASK SET (INTERRUPT NOT USE) =47AE B002 MOV AL,02H =47B0 E632 OUT RSIM,AL DR * = ;* 6 = UNUSED * = ;* 5 = UNUSED * = ;*  8000 DW 0080H ; 1200 =66EC 4000 DW 0040H ; 2400 =66EE 2000 DW 0020H ; 4800 =66F0 1000 DW  ; DUMMY MODE SET =47B2 B040 MOV AL,40H =47B4 E632 OUT RSIC,AL ; COMMUNICATION PORT RESET =47B6 B076 MOV AL,76H =47B8 E62F O 4 = UNUSED * = ;* 3 = UNUSED * = ;* 2 = MODEM CS *  0010H ; 9600 =66F2 0800 DW 0008H ; 19200 *R1.131 '82 12/24 = = ; = ;***** VECTOR TO APFOPRIATE ROUTINE ***** = ; = UT RSCM,AL ; COUNTER MODE SET =47BA 8ADE MOV BL,DH ; SET INIT PARM =47BC D0E3 SHL BL,1 =47BE 81E31E00 AND BX,001EH =47C2 8B87E266 = ;* 1 = MODEM CI * = ;* 0 = MODEM CD * = ;*  CSEG $ = RS232_IO: =4788 53 PUSH BX ; REGISTOR SAVE =4789 51 PUSH CX =478A 52 PUSH DX =478B 0AE4  MOV AX,OFFSET BAUD_TBL[BX] ; READ BAUD RATE SET DATA =47C6 E62B OUT RSCS,AL ; COUNTER (LOW) SET =47C8 8AC4 MOV AL,AH =47CA E62B OUT RSCS,AL  * = ;********************************************************************** = ;* = ; = ;***** DEFINE I/O PORT NO. ***** =  OR AH,AH CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 146 =478D 7419 47A8 JZ RSIN00 ; IF AH=0 (INITIALIZE) =478F 80FC!  ; COUNTER (HIGH) SET =47CC 8AC1 MOV AL,CL ; SET INIT PARM =47CE E632 OUT RSIM,AL ; COMMUNICATION PORT MODE SET =47D0 B007 MOV AL,07H =47D2802 8AD0 MOV DL,AL ; STATUS SAVE =4804 58 POP AX =4805 EB07 480E JMPS RSSN50 = RSSN40: =4807 247F AND AL,7FH CHARACTOR =4838 E969FF 47A4 JMP RS232_RET = ; = ;***** STATUS READ ***** = ; = RSSR00: =483B 2AD2 SUB DL,DL  E632 OUT RSIC,AL ; MODEM ER ON =47D4 2AC0 SUB AL,AL =47D6 E636 OUT RSWS,AL ; RESET TDC =47D8 8BC1 MOV AX,CX  ; CLR TIME OUT =4809 8AD0 MOV DL,AL ; STATUS SAVE =480B 58 POP AX =480C E630 OUT RSIW,AL ; SEND CHARACTOR = R =483D E432 IN AL,RSIS ; READ STATUS =483F A880 TEST AL,80H =4841 7502 4845 JNZ RSSR10 ; IF DR IS ON =4843 B280 MOV  ; REGISTOR RESTORE =47DA E9C7FF 47A4 JMP RS232_RET = ; = ;***** SEND CHARACTOR ***** = ; = RSSN00: =47DD 50 PUSH SSN50: =480E 8AE2 MOV AH,DL ; STATUS RESTORE =4810 E991FF 47A4 JMP RS232_RET = ; = ;***** RECEIVE CHARACTOR ***** = ; =  DL,80H = RSSR10: =4845 247F AND AL,7FH ; TIME OUT BIT CLEAR ** R1.133 '83/03/31 =4847 8AE0 MOV AH,AL =4849 E434 IN AL,RSRS  AX =47DE B027 MOV AL,27H =47E0 E632 OUT RSIC,AL ; MODEM RS,ER ON =47E2 2BC9 SUB CX,CX ; INIT TIME OUT COUNTER = RSSN10 RSRV00: =4813 B007 MOV AL,07H =4815 E632 OUT RSIC,AL ; MODEM ER ON =4817 2BC9 SUB CX,CX ; INIT TIME OUT COUNTER =  ; READ MODEM SIGNAL =484B 0AC2 OR AL,DL =484D E954FF 47A4 JMP RS232_RET CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 149 = : CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 147 =47E4 E432 IN AL,RSIS ; READ STATUS =47E6 A880 TEST AL,80H =4 RSRV10: =4819 E432 IN AL,RSIS ; RESD STATUS =481B A880 TEST AL,80H =481D 7504 4823 JNZ RSRV20 ; IF DR IS ON =481F E2F8 4819  EJECT = ; R1.133 '83/03/31 = ;**************************************************************** = ;* 7E8 7504 47EE JNZ RSSN20 ; IF DR IS ON =47EA E2F8 47E4 LOOP RSSN10 ; WAIT DR =47EC EB12 4800 JMPS RSSN30 = RSSN20: =47EE E434  LOOP RSRV10 ; WAIT DR =4821 EB06 4829 JMPS RSRV30 ; IF TIME OUT ** R 1.133 '83/03/31 = RSRV20: =4823 A802 TEST AL,02H =4825 7 * = ;* OPTION RS232C INTERFACE FANCTION (CMA2) * = ;* * = ;* INPUT CH=SUB FUNCTION CODE  IN AL,RSRS ; READ SIGNAL =47F0 A804 TEST AL,04H ; =47F2 7504 47F8 JNZ RSSN25 ; IF CS IS ON =47F4 E2F8 47EE LOOP RSSN20 =47F650B 4832 JNZ RSRV40 ; IF RECEIVER READY =4827 E2F0 4819 LOOP RSRV10 ; WAIT RECV = RSRV30: =4829 0C80 OR AL,80H ; SE * = ;* * = ;* CH=0 INITIALIZE COMMUNICATION PORT * = ;* IN EB08 4800 JMPS RSSN30 ; = RSSN25: =47F8 E432 IN AL,RSIS ; READ STATUS =47FA A805 TEST AL,05H =47FC 7509 4807 JNT TIME OUT =482B 8AE0 MOV AH,AL =482D 2AC0 SUB AL,AL =482F E972FF 47A4 JMP RS232_RET = RSRV40: CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O SystemPUT DL=8251A MODE SET DATA * = ;* DH=BAUD RATE * = ;* CH=1 8251A COMMAND INSTRUCTION * = ;* Z RSSN40 ; IF TRNSMITTER READY (CS IS ON) =47FE E2E4 47E4 LOOP RSSN10 ; WAIT SEND = RSSN30: =4800 0C80 OR AL,80H ; SET TIME OUT =4 V1 PAGE 148 =4832 247F AND AL,7FH ; CLR TIME OUT =4834 8AE0 MOV AH,AL =4836 E430 IN AL,RSIR ; RECV !  INPUT DL=8251A COMMAND SET DATA * = ;* CH=2 8251A STATUS GET * = ;* OUTPUT AL=8251A STATUS * =  RSIW2 EQU 31H ; SEND DATA WRITE = 0061 RSCS2 EQU 61H ; COUNTER SET = 0067 RSCM2 EQU 67H ; COUNTER MODE SET = 0035 RSMK2 EQU 35H UNCTION IS AVAILABLE VALUE =485B C3 RET = RS232_IO210: =485C BBF566 MOV BX,OFFSET RS2FNENTTBL =485F 32E4 XOR AH,AH =4861 D1E0 SHL AX, ;* CH=3 READ DATA FROM 8251A RECIEVE BUFFER * = ;* OUTPUT AL=RECIEVE DATA * = ;* CH=4 WRITE DATA TO 8251A TRANSMIT BUFFER *  ; MASK SET = 0035 RSRS2 EQU 35H ; READ MODEM SIGNAL = 0037 RSWS2 EQU 37H ; WRITE LINE CLOSE = ; = ;***** FUNCTION TABLE ***** = 1 =4863 03D8 ADD BX,AX =4865 FF27 JMP WORD PTR [BX] ; JUMP EACH FUNCTION = ;******************************************************** = ;* FNC#  = ;* INPUT DL=SEND DATA * = ;* CH=5 READ MODEM SIGNAL * = ;* OUTPUT AL=MODEM SIGNAL ( ; =66F4 08 RS2FNENTCNT DB 8 =66F5 6748 RS2FNENTTBL DW RS2FN0 ; FNC# 0 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 0 (INITIALIZE COMMUNICATIN PORT) * = ;******************************************************** = ; = RS2FN0: =4867 8B162366 MOV DX,INT_DX ; LCD,CI,CS,SCA) * = ;* CH=6 WRITE MODEM SIGNAL * = ;* INPUT DL=MODEM SIGMAL (TDC) * = ;* CH=7 GET LASTPAGE 150 =66F7 A148 DW RS2FN1 ; FNC# 1 =66F9 B448 DW RS2FN2 ; FNC# 2 =66FB BA48 DW RS2FN3 ; FNC# 3 =66FD BE48 OAD 8252A MODE & BAUD RATE = RS2FN010: =486B 80FE09 CMP DH,9 =486E 7205 4875 JB RS2FN020 ; IF BAUD RETE <= 8(19200 BAUD) =4870 80EE09 SUB DH,9 =487 SET PARAMETER * = ;* OUTPUT AL=LAST SET 8251A COMMAND * = ;* AH=LAST SET WRITE MODEM SIGNAL * = ;*  DW RS2FN4 ; FNC# 4 =66FF C448 DW RS2FN5 ; FNC# 5 =6701 C848 DW RS2FN6 ; FNC# 6 =6703 D148 DW RS2FN73 EBF6 486B JMPS RS2FN010 = RS2FN020: =4875 89160767 MOV WORD PTR CMA2MODE,DX ; SAVE 8251A MODE & BAUD RATE SET DATA = ; = ;***** INITIALIZE C DL=LAST SET 8251A MODE * = ;* DH=LAST SET BAUD RATE * = ;* CH=OTHER * =  ; FNC# 7 = ; = ;***** PARAMETER SAVE AREA (FOR OPTION RS232C INTERFACE FNC.) ***** = ; =6705 FF CMA2CMD DB 0FFH ; 8251A COMMAND =6706 OMMUNICATION PORT (CMA 2) ***** = ; = RS2FN030: =4879 B007 MOV AL,07H =487B E635 OUT RSMK2,AL ; MASK SET (INTERRUPT NOT USE) =487D B002  ;* NO FUNCTION * = ;* * = ;**************************************************************** = FF CMA2MODEM DB 0FFH ; WRITE MODEM SIGNAL =6707 FF CMA2MODE DB 0FFH ; 8251A MODE =6708 FF CMA2BAUD DB 0FFH ; BAUD RATE =  MOV AL,02H CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 151 =487F E633 OUT RSIM2,AL ; DUMMY MODE SET =4881 B040  ; = DSEG $ = ; = ;***** DEFINE OPTION RS232C INTERFACE(CMA 2) I/O PORT NO. ***** = ; = 0033 RSIM2 EQU 33H  ; = ; = ;***** OPTION RS232C INTERFACE FUNCTION ENTRY ***** = ; = CSEG $ = ; = RS232_IO2: =4850 A1216 MOV AL,40H =4883 E633 OUT RSIC2,AL ; COMMUNICATION PORT RESET =4885 B036 MOV AL,36H ; COUNTER #0 =4887 E667 OUT RSCM2,AL  ; MODE SET = 0033 RSIC2 EQU 33H ; COMMAND SET = 0033 RSIS2 EQU 33H ; STATUS READ = 0031 RSIR2 EQU 31H ; RECV DATA READ = 0031 6 MOV AX,INT_CX ; LOAD SUB FUNCTION CODE =4853 8AC4 MOV AL,AH =4855 3A06F466 CMP AL,RS2FNENTCNT =4859 7201 485C JB RS232_IO210 ; IF SUB F"  ; COUNTER MODE SET =4889 33DB XOR BX,BX =488B 8ADE MOV BL,DH ; SET BAUD RATE PARAMETER =488D D1E3 SHL BX,1 =488F 8B87E266 MOV AX,O************************************** = ;* FNC# 3 (READ DATA FROM 8251A RECIEVE BUFFER) * = ;******************************************************** = ; = ;******************************************************** = ; = RS2FN7: =48D1 A10567 MOV AX,WORD PTR CMA2CMD =48D4 A31566 MOV INT_AX,AX ; COPY LAST SET 8251FFSET BAUD_TBL[BX] ; LOAD COUNTER SET DATA =4893 E661 OUT RSCS2,AL ; SET COUNTER (LOW) =4895 8AC4 MOV AL,AH =4897 E661 OUT RSCS2,AL ; SET COUNTER ( RS2FN3: =48BA E431 IN AL,RSIR2 ; READ RECIEVE BUFFER DATA =48BC EBF8 48B6 JMPS RS2FN210 = ;******************************************************** = A COMMAND & WRITE MODEM SIGNAL DATA =48D7 A10767 MOV AX,WORD PTR CMA2MODE =48DA A32366 MOV INT_DX,AX ; COPY LAST SET 8251A MODE & BAUD RATE DATA =48DD C3 RET HIGH) =4899 8AC2 MOV AL,DL ; LOAD 8251A MODE SET DATA =489B E633 OUT RSIM2,AL ; COMMUNICATION PORT MODE SET =489D 2AC0 SUB AL,AL =489F EB2A  ;* FNC# 4 (WRITE DATA TO 8251A TRANSMIT BUFFER) * = ;******************************************************** = ; = RS2FN4: =48BE A12366 MOV AX,INT_DX  END ;----------------------------------------------- CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 153 EJECT  48CB JMPS RS2FN62 ; RESET TDC = ;******************************************************** = ;* FNC# 1 (8251A COMMAND INSTRUCTION) * = ;*** ; LOAD SEND DATA =48C1 E631 OUT RSIW2,AL ; WRITE DATA TO TRANSMIT BUFFER CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 152 =48C CSEG $ GETIOBF: 48DE 2EA08725 mov al,IOBYTE 48E2 C3 ret SETIOBF: 48E3 2E880E8725 mov IOBYTE,cl ;set***************************************************** = ; = RS2FN1: =48A1 A12366 MOV AX,INT_DX ; LOAD 8251A COMMAND SET DATA =48A4 A840 TEST AL,40H3 C3 RET = ;******************************************************** = ;* FNC# 5 (READ MODEM SIGNAL) * = ;******************************** iobyte 48E8 C3 ret ;iobyte not implemented pmsg: 48E9 2E800E862580 OR ALTRBYTFLG,80H 48EF 8A07 mov al,[BX] ;get next char from m =48A6 7406 48AE JZ RS2FN110 ; IF INTERNAL RESET BIT IS OFF =48A8 C7060767FFFF MOV WORD PTR CMA2MODE,0FFFFH ; LAST SET MODE & BAUD RATE CLR. = RS2FN110: =48AE A20567 ************************ = ; = RS2FN5: =48C4 E435 IN AL,RSRS2 ; READ MODEM SIGNAL =48C6 EBEE 48B6 JMPS RS2FN210 = ;**********essage 48F1 84C0 test al,al 48F3 7408 48FD jz pmsg010 ;if zero return 48F5 8AC8 mov CL,AL 48F7 E8B0E9 32AA call CONOUT ;print it 48FA 43  MOV CMA2CMD,AL ; SAVE 8251A COMMAND =48B1 E633 OUT RSIC2,AL ; WRITE 8251A COMMAND =48B3 C3 RET = ;******************************************************************************************* = ;* FNC# 6 (WRITE MODEM SIGNAL) * = ;******************************************************** = ; =  inc BX 48FB EBEC 48E9 jmps pmsg ;next character and loop pmsg010: 48FD 2E802686257F AND ALTRBYTFLG,7FH 4903 C3 ret CP/M ASM86 1.1 SOU*********** = ;* FNC# 2 (8251A STATUS GET) * = ;******************************************************** = ; = RS2FN2: =48B4 E433  RS2FN6: =48C8 A12366 MOV AX,INT_DX = RS2FN62: =48CB A20667 MOV CMA2MODEM,AL ; SAVE WRITE MODEM SIGNAL DATA =48CE E637 OUT RSWS2,AL RCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 154 EJECT ;********************************************* ;*  IN AL,RSIS2 ; READ 8251A STATUS = RS2FN210: =48B6 A21566 MOV BYTE PTR INT_AX,AL ; STORE =48B9 C3 RET = ;****************** ; WRITE MODEM SIGNAL =48D0 C3 RET = ;******************************************************** = ;* FNC# 7 (GET LAST SET PARAMETER) * = "  * ;* Disk Input/Output Routines * ;* * ;*********************************************  4988 JNZ DISK100 ; IF NOT FIRST ACCESS DISK001: 4941 BBC068 MOV BX,OFFSET DVCCMD ; 4944 E86408 51AB CALL SENDCOM ;  DISK005: 497A 8B1EB875 MOV BX,FIDSAV ; BX = ACCESS FD UNIT NO. 497E C60700 MOV BYTE PTR[BX],0 ; 4981 A808 TEST AL,08H ; 4983 743B  SELDSK: ; SELECT DISK GIVEN BY REGISTER CL ; IS THIS THE FIRST ACTIVATION OF THE DRIVE? 4904 FC CLD ; 4905 8816CF6A  DISK003: 4947 E450 IN AL,50H ; 4949 D0E0 SHL AL,1 ; IF RQM ON 494B 73FA 4947 JAE DISK003 ; 494D D0E0  49C0 JZ DISK009 ; IF FD = 1 4985 C60701 MOV BYTE PTR [BX],1 ; DISK100: 4988 803F00 CMP BYTE PTR[BX],0 ; 498B 7433 49C0  MOV FSTACSS,DL ; 4909 880ED16A MOV DRVNM,CL ; SAVE DRIVE NO. ;---------------*R1.107 '83 6/6 ------------------------------------ 490D 80F90F  SHL AL,1 ; & DIO OFF 494F 73F6 4947 JAE DISK003 ; 4951 E452 IN AL,52H ; 4953 A820 TEST AL,20H ;  JE DISK009 ; IF FD = 1 ; ; FDD = 2D PROC. DISK008: 498D C606B37501 MOV FID,1 ; FD = 2D  CMP CL,15 4910 7606 4918 JNA SELDSK00 ; 4912 BB0000 MOV BX,0 ; IF UNIT NO. INPUT ERROR 4915 E9A700 49BF JMP DISKRET ;  4955 747E 49D5 JZ DISK007 ; IF FDD NOT READY 4957 A840 TEST AL,40H ; 4959 741F 497A JZ DISK005 ; ;------------- DISK030: ; THIS IS THE ACTIVATION, CLEAR HOST BUFF 4992 BBE66B MOV BX,OFFSET R_W_BUFF2D ; 4995 BA926F MOV DX,OFFSET DPBASE2 ; 4998 803ECF6A00 CMP  SELDSK00: ;--------------------------------------------------------------------- 4918 BBA225 MOV BX,OFFSET SYSUNITID ; UNIT TABLE ADDRESS 491B 2AED SUB CH,CH ----- *1.131 '82 12/23 Delete ------------------ CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 155 ; FDD WRITE PROTECTED PROC.  FSTACSS,0 ; 499D 750A 49A9 JNE DISK040 ; 499F C606A27500 MOV HSTACT,0 ; 49A4 C606A77500 MOV UNACNT,0 ;  ; 491D 03D9 ADD BX,CX ; BDOS UNIT NO ->BIOS UNIT NO 491F 8A0F MOV CL,[BX] ; 4921 F6C1C0 TEST CL,0C0H ; 4924 7403  ;--------------- R1.132 '83 3/8 ------------------------------------------- 495B F606CF6A01 TEST FSTACSS,01H ; WRITE PROTECT FIRST ACCESS 4960 7518 497A JNZ DISK005 ; NON DISK040: 49A9 8A0ED06A MOV CL,SVDSK ; 49AD 880E9D75 MOV SEKDSK,CL ; SAVE DISK NUMBER DISK045: 49B1 891EDF6A MOV DMA_BUFF,BX  4929 JZ DISK000 ; 4926 E9D500 49FE JMP DISK999 ; IF NOT FLOPPY DISK DISK000: 4929 880ED06A MOV SVDSK,CL ; 492D 880EC268 ;--------------------------------------------------------------------------- 4962 50 PUSH AX ; 4963 8A1ED16A MOV BL,DRVNM ; UNIT NO 4967 80E30F  ; 49B5 B500 MOV CH,0 ; DOUBLE(N) 49B7 8BD9 MOV BX,CX ; BX = N 49B9 B104 MOV CL,4 ; READY FOR *16 49BB D3E3  MOV DVC_US,CL ; 4931 2AED SUB CH,CH ; 4933 BBB475 MOV BX,OFFSET FD0FID ; 4936 03D9 ADD BX,CX ; 4 AND BL,0FH ; 496A 80CB40 OR BL,40H ; 496D FEC3 INC BL ; 496F 881E116A MOV WPFDNO,BL ; UNIT NO SHL BX,CL ; N = N * 16 49BD 03DA ADD BX,DX ; DPBASE + N * 16 DISKRET: 49BF C3 RET ; BX = .DPPH 938 891EB875 MOV FIDSAV,BX ; BX = ACCESS UNIT NO. ;---------- *R1.107 6/6 DELETE ----------------------------------- 493C F6C201 TEST DL,01H ; 493F 7547  SET 4973 BBF969 MOV BX,OFFSET WRTPROMSG ; 4976 E870FF 48E9 CALL PMSG ; WRITE PROTECTED MESSAGE OUT 4979 58 POP AX ; #  ; ; FDD = 1 PROC. DISK009: 49C0 C606B37500 MOV FID,0 ; FD = 1 DISK010: CP/M ASM86 1.1 SOURCE: USCBIOS.A86 : 4A08 880EBA75 MOV HDUNITID,CL ; SELECT HD UNIT NO SAVE 4A0C 80E10F AND CL,0FH ; 4A0F 880ED06A MOV SVDSK,CL ; DRIVE NO. = 0 - F (MAX) 4A13 GETPMAP1: 4A5E 2AE4 SUB AH,AH ; *R1.131 '82 12/23 4A60 8A4404 MOV AL,4[SI] ; *R1.131 '82 12/23 4A63 40 Customized Basic I/O System V1 PAGE 156 49C5 BB666B MOV BX,OFFSET R_W_BUFF ; 49C8 BAEC6D MOV DX,OFFSET DPBASE ; 49CB 8A0ED06A MOV  C606B37502 MOV FID,2 ; 4A18 803ECF6A00 CMP FSTACSS,0 ; 4A1D 750A 4A29 JNE DISK220 ; 4A1F C606A47500 MOV HSTACTHD,0  INC AX ; 4A64 D1E0 SHL AX,1 ; ( FREE TRACK + 1 ) * 2 4A66 03F8 ADD DI,AX ; 4A68 83C606 ADD SI,6  CL,SVDSK ; 49CF 880EA868 MOV DISK,CL ; 49D3 EBD4 49A9 JMPS DISK040 ; ; FDD NOT READY PROC. ;  ; 4A24 C606A77500 MOV UNACNT,0 ; DISK220: 4A29 2AE4 SUB AH,AH ; 4A2B A0BA75 MOV AL,HDUNITID ; 4A2E B104  ; 4A6B E2F1 4A5E LOOP GETPMAP1 ; GETPMAP2: 4A6D C3 RET ; ; ; ;**** DISK007: 49D5 8A1ED16A MOV BL,DRVNM ; 49D9 80E30F AND BL,0FH ; 49DC 80CB40 OR BL,40H ; 49DF FEC3  MOV CL,4 ; 4A30 D2E8 SHR AL,CL ; 4A32 2403 AND AL,03H ; UNIT NO. 0 - 3 (MAX) 4A34 A29D75 MOV SEKDSK,A************************************************************ ;* MOVE SELECTED DISK TO HOME POSITION (TRACK 0) * ;**************************************************************** INC BL ; 49E1 881E7869 MOV FDNO,BL ; 49E5 BB6069 MOV BX,OFFSET NORDYMSG ; 49E8 E8FEFE 48E9 CALL PMSG ; 49EB E8F9E0 2L ; 4A37 2AED SUB CH,CH ; 4A39 8A0ED06A MOV CL,SVDSK ; 4A3D 51 PUSH CX ; 4A3E E81500 4A56 CALL ; HOME: ; CHECK HOST WRITE FLAG 4A6E FC CLD 4A6F A0A868 MOV AL,DISK ; 4A72 803EB37500 CMP FID,0 AE7 CALL CONIN ; 49EE 3C52 CMP AL,'R' ; 49F0 7409 49FB JE DISK111 ; IF RETRY ; 49F2 3C72 CMP AL,'r' ; 49F4 74 GETPMAP ; GET ERROR MAP POINT CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 157 4A41 8B04 MOV AX,[SI] ; 4A43 A3D56A  ; 4A77 7437 4AB0 JE HOME018 ; IF FDD = 1 ;HOME THE SELECTED DISK 4A79 A0A375 MOV AL,HSTWRT ; CHECK FOR PENDING WRITE 4A7C 84C0 05 49FB JE DISK111 ; IF RETRY ; 49F6 BB0000 MOV BX,0 ; 49F9 EBC4 49BF JMPS DISKRET ; DISK111: 49FB E943FF 4941  MOV HDSOT,AX ; START OF TRACK 4A46 893EC86A MOV SEKPMAP,DI ; 4A4A 5B POP BX ; BL = SVDSK 4A4B B104 MOV CL, TEST AL,AL ; 4A7E 7403 4A83 JZ HOME010 ; ; *** Flush dirty buffer with correct wrtype for buffer ; *** Delete / NEC '83 12/2 JMP DISK001 ; ; DISK999: 49FE F6C180 TEST CL,80H ; 4A01 7405 4A08 JZ DISK150 ; IF HARD DISK 4A03 BB004 ; 4A4D D2E3 SHL BL,CL ; 4A4F 81C37472 ADD BX,OFFSET HDDPBASE ; HD PARAM.ADDRESS 4A53 E969FF 49BF JMP DISKRET ; 6 *** 4A80 E80B05 4F8E CALL W_COMMON2D ; ; *** Delete / NEC '83 12/26 *** HOME010: 4A83 C606A27500 MOV HSTACT,0 ; 4A88 C606A37500 00 MOV BX,0 ; IF NOT AVAILAVLE 4A06 EBB7 49BF JMPS DISKRET ; ; ; HDD FLAG SET & HDD PROC DISK150 ; GETPMAP: 4A56 BF0D74 MOV DI,HDERRMAP ; 4A59 BEB225 MOV SI,HDADT ; 4A5C E30F 4A6D JCXZ GETPMAP2 ; #  MOV HSTWRT,0 ; 4A8D A0A575 MOV AL,HSTWRTHD ; CHACK FOR PENDING WRITE 4A90 84C0 TEST AL,AL ; 4A92 7408 4A9C JZ HOME015 89B09 5479 CALL HDPIO ; HD CMD CALL 4ADE 0BDB OR BX,BX ; 4AE0 7505 4AE7 JNZ HOME045 ; 4AE2 E81B09 5400 CALL HDTMOMSG NIT IGNORE 4B24 0CFF OR AL,255 ; IF ACCESS UNIT IGNORE 4B26 EB0D 4B35 JMPS SENS_NOT_READY SENS010: 4B28 24F8 AND AL,0F8H 4B2A A808  ; 4A94 C606BA68F0 MOV HSTRWTX,HDC_WRT ; WRITE CMD SET 4A99 E84907 51E5 CALL R_W_COMMONHD ; ( SAME W_COMMON2D ) HOME015: 4A9C C606A47500 MOV  ; H/D TIME OUT MESSAGE OUTPUT 4AE5 EB16 4AFD JMPS HOMERET ; HOME045: 4AE7 8A07 MOV AL,[BX] ; STATUS POINTER = BX 4AE9 2460  TEST AL,08H 4B2C 7507 4B35 JNZ SENS_NOT_READY 4B2E 3C20 CMP AL,020H ; CHECK SEEK END 4B30 75CC 4AFE JNE SENS SENS020: 4B32 HSTACTHD,0 ; CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 158 4AA1 C606A57500 MOV HSTWRTHD,0 ; 4AA6 803EB37502 CMP  AND AL,60H 4AEB 3C40 CMP AL,40H 4AED 740E 4AFD JE HOMERET ; 4AEF E8D808 53CA CALL HDERRMSG ; H/D ERROR MESSAGE OUTPUT 4AF2 E8F2DF 2AE7 2400 AND AL,0 ; NORMAL END 4B34 C3 RET SENS_NOT_READY: 4B35 C3 RET SETTRK: ;SET TRACK ADDRESS GIVEN BY CX 4B FID,2 ; 4AAB 7423 4AD0 JE HOME030 ; IF HARD DISK 4AAD A09D75 MOV AL,SEKDSK ; HOME018: 4AB0 A2C568 MOV HOMERU CALL CONIN ; 4AF5 3C52 CMP AL,'R' ; 4AF7 74DC 4AD5 JE HOME040 ; RETRY 4AF9 3C72 CMP AL,'r' ; 4AFB 36 803EB37500 CMP FID,0 ; FDD = 1D ? 4B3B 7433 4B70 JE TRK010 ; YES, FDD = 1D 4B3D 890E9E75 MOV SEKTRK,CX ; SEEK TO TRACK 4B41 803EB37502 ,AL ; HOME020: 4AB3 BBC368 MOV BX,OFFSET HOMER ; 4AB6 E8F206 51AB CALL SENDCOM ; SEND SEEK CMD 4AB9 E84200 4AFE CALL SENS 74D8 4AD5 JE HOME040 ; RETRY HOMERET: 4AFD C3 RET ; SENS: 4AFE BBCA68 MOV BX,OFFSET SENSCMD  CMP FID,2 4B46 742C 4B74 JE TRK020 4B48 83F900 CMP CX,0 4B4B 7423 4B70 JE TRK010 ; IF TRSCK = 0 4B4D 8BC1 MOV AX,CX 4B4F 2 ; SENSE SEEK END 4ABC 3C00 CMP AL,0 ; 4ABE 743D 4AFD JE HOMERET ; 4AC0 E8A806 516B CALL ERRMSG ; 4AC3 E821E0 2AE7 4B01 E8A706 51AB CALL SENDCOM ; 4B04 B90200 MOV CX,02H ; 4B07 E8BF06 51C9 CALL EXECPOLL ; 4B0A A05869 MOV AL,STATUS0 50100 AND AX,01H 4B52 A2CE6A MOV SEKHED,AL ; HEDER 4B55 D1E9 SHR CX,1 ; 4B57 880ECB6A MOV SEKCLND,CL ; 4B5B 2A CALL CONIN ; 4AC6 3C52 CMP AL,'R' ; 4AC8 74E9 4AB3 JE HOME020 ; 4ACA 3C72 CMP AL,'r' ; 4ACC 74E5  4B0D 8AC8 MOV CL,AL 4B0F 80E1C0 AND CL,0C0H ; MASK IGNORE CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 159 4B1E4 SUB AH,AH 4B5D A0CE6A MOV AL,SEKHED 4B60 B90200 MOV CX,2 4B63 D3E0 SHL AX,CL 4B65 8A0E9D75 MOV CL,SEKDSK 4B69 0BC1  4AB3 JE HOME020 ; 4ACE EB2D 4AFD JMPS HOMERET ; HOME030: 4AD0 A09D75 MOV AL,SEKDSK ; HD RECALIBRATE CMD 4AD3 0C50 2 80F9C0 CMP CL,0C0H ; 4B15 7511 4B28 JNE SENS010 ; IF NOT IGNORE 4B17 2403 AND AL,03H ; MASK UNIT NO. 4B19 8A0EC268  OR AX,CX 4B6B A2CA6A MOV SEKHD_US,AL ; HED AND SIDE 4B6E EB04 4B74 JMPS TRK020 4B70 880EA968 TRK010: MOV TRK,CL 4B74 C3 TRK020: RET  OR AL,50H HOME040: 4AD5 A21D67 MOV RECHD,AL ; HD UNIT NO. + RECALIBRATE CMD 4AD8 BB1C67 MOV BX,HDHOMER ; HOMER CMD ADDRESS 4ADB E MOV CL,DVC_US 4B1D 80E103 AND CL,03H ; MASK ACCESS UNIT NO. 4B20 3AC1 CMP AL,CL ; 4B22 750E 4B32 JNE SENS020 ; IF NOT ACCESS U$  ; SETSEC: ; SET SECTOR NUMBER GIVEN BY CX 4B75 803EB37500 CMP FID,0 ; FDD = 1D? 4B7A 7434 4BB0 JE SEC010 4B7C 880EA075 MOV SEKSEC,CL  SETDMAB: ; SET DMA SEGMENT GIVEN BY CX 4BCB 890EC16A MOV DMA_SEG,CX 4BCF C3 RET ; GETSEGT: ; RETURN ADDRESS OF PHYSICAL MEMORY TABLE 4BD0 BBE76D MA_BUFF 4BF7 8B3EBF6A MOV DI, DMA_ADR 4BFB 06 PUSH ES 4BFC 8E06C16A MOV ES,DMA_SEG 4C00 F3A4 REP MOVS AL,AL ; 4C02 07  ; SECTOR TO SEEK 4B80 803EB37502 CMP FID,2 4B85 742D 4BB4 JE SEC020 ; IF HD DISK = RETURN 4B87 833E9E7500 CMP SEKTRK,0 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Custom MOV BX,OFFSET SEG_TABLE 4BD3 C3 RET CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 161 EJECT  POP ES 4C03 58 POP AX 4C04 803EB07500 CMP HOMEFLG,0 4C09 7411 4C1C JE READ005 ; IF NOT CYLINDER 0 , HED 0 4C0B C606B07500 MOV HOMEFLGized Basic I/O System V1 PAGE 160 4B8C 7526 4BB4 JNE SEC020 ; IF NOT TRACK = 0 4B8E 80F91A CMP CL,1AH 4B91 7F21 4BB4 JG SEC02 ;************************************************ ;* * ;* All disk I/O parameters are setup: * ;* DISK is disk numb,0 4C10 C606B37501 MOV FID,1 ; FD2D 4C15 BBE66B MOV BX,OFFSET R_W_BUFF2D 4C18 891EDF6A MOV DMA_BUFF,BX READ005: 4C1C C3 0 ; IF SECTOR > 26 4B93 C606B37500 MOV FID,0 4B98 C606B07501 MOV HOMEFLG,1 4B9D A09D75 MOV AL,SEKDSK 4BA0 A2A868 MOV DISK,AL 4BA3 A19E75 er (SELDSK) * ;* TRK is track number (SETTRK) * ;* SECT is sector number (SETSEC) * ;* DMA_ADR is the DMA offset (SETDMA) *  RET READ010: 4C1D EB51 4C70 jmps read2d write: 4C1F FC cld 4C20 803EB37500 cmp fid,0 4C25 7547 4C6E jne wrt050  MOV AX,SEKTRK 4BA6 A2A968 MOV TRK,AL 4BA9 BB666B MOV BX,OFFSET R_W_BUFF 4BAC 891EDF6A MOV DMA_BUFF,BX SEC010: 4BB0 880EAB68  ;* DMA_SEG is the DMA segment (SETDMAB) * ;* READ reads the selected sector to the DMA * ;* address, and WRITE writes the data from * ;* the DMA add ; if hd or f2d 4C27 C606E16A19 MOV DMA_RW,DMA_WRT ; DMA (MEMORY TO IO ) CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 162 MOV SECT,CL 4BB4 C3 SEC020: RET ; SECTRAN: ; TRANSLATE SECTOR CX USING TABLE AT [DX] 4BB5 83FA00 CMP DX,0 ; 4BB8 7408 4BC2 ress to the selected sector * ;* (return 00 if successful, 01 if perm err) * ;* * ;********************************************* ; MOVE WRITE DATA IN DMA_ADD TO DMA_BUFF 4C2C B98000 MOV CX,128 4C2F 8B36BF6A MOV SI, DMA_ADR 4C33 8B3EDF6A MOV DI, DMA_BUFF 4C37 8CD8 MOV AX,DS 4C39 JE TRAN010 ; IF NOT TRAN TABLE ADDRESS 4BBA 8BD9 MOV BX,CX 4BBC 03DA ADD BX,DX ; ADD SECTOR TO TRAN TABLE ADDRESS 4BBE 8A1F MOV BL,[BX]*** ; read: 4BD4 FC cld 4BD5 803EB37500 cmp fid,0 4BDA 7541 4C1D jne read010 ; if hd or f2d 4BDC C606E16A15  8EC0 MOV ES,AX 4C3B 1E PUSH DS 4C3C 8E1EC16A MOV DS,DMA_SEG 4C40 F3A4 REP MOVS AL,AL 4C42 1F POP DS  ; GET LOGICAL SECTOR 4BC0 EB03 4BC5 JMPS TRAN020 TRAN010: 4BC2 8BD9 MOV BX,CX 4BC4 43 INC BX TRAN020: 4BC5 C3  MOV DMA_RW ,DMA_RAD ; DMA (IO TO MEMORY) 4BE1 B006 MOV AL,FDC_RAD1D ; 4BE3 BBA668 MOV BX,OFFSET IOCB ; 4BE6 C706C36A7F00 MOV DMA_TC,TC1D ; WRT020: 4C43 B005 MOV AL,FDC_WRT1D ; 4C45 BBA668 MOV BX,OFFSET IOCB ; 4C48 C706C36A7F00 MOV DMA_TC,TC1D 4C4E E8CF03 5020 CALL R_W_COMMON 4C51  RET ; SETDMA: ; SET DMA OFFSET GIVEN BY CX 4BC6 890EBF6A MOV DMA_ADR,CX 4BCA C3 RET ;  4BEC E83104 5020 CALL R_W_COMMON 4BEF 50 PUSH AX ; MOVE READ DATA IN DMA_BUFF TO DMA_ADR 4BF0 B98000 MOV CX,128 4BF3 8B36DF6A MOV SI, D$ 3C00 CMP AL,0 4C53 7518 4C6D JNE WRT040 ; IF ERROR ; (DELETE) *R1.131 '82 12/22 WRT030: 4C55 8 mov blksiz,fdblksiz 4C9F C606B27534 mov cpmspt,fdspt wrtf2d: 4CA4 C606AE7500 mov readop,0 ; write operation 4CA9 880EAF75 mov wrtype,cl 4CAD the same 4CE1 A1A975 mov ax,unatrk 4CE4 3B069E75 cmp ax,sektrk 4CE8 7526 4D10 jnz alloc ; skip if not ; ; tracks03EB07500 CMP HOMEFLG,0 4C5A 7411 4C6D JE WRT040 ; IF NOT CYLINDER 0 ,HED 0 4C5C C606B07500 MOV HOMEFLG,0 4C61 C606B37501 MOV FID,1 ; FD280F902 cmp cl,wrual ; write unallocated? 4CB0 7518 4CCA jnz chkuna ; check for unalloc ; ; write to unallocated, set parame are the same 4CEA A0A075 mov al,seksec ; same sector? ; 4CED BBAB75 mov bx,offset unasec ; point una at unasec ; 4CF0 3A07 D 4C66 BBE66B MOV BX,OFFSET R_W_BUFF2D 4C69 891EDF6A MOV DMA_BUFF,BX 4C6D C3 WRT040: RET 4C6E EB23 4C93 WRT050: JMPS WRITE2D ; FD2D WRITE CP/M ASM86 1.1 SOURCEters ; 4CB2 A0B175 mov al,blksiz 4CB5 A2A775 mov unacnt,al ; next unalloc recs 4CB8 A09D75 mov al,sekdsk ; disk to seek  cmp al,una ; seksec = unasec? 4CF2 751C 4D10 jnz alloc ; skip if not ; ; match, move to next sector for future ref 4CF4 FE07 : USCBIOS.A86 Customized Basic I/O System V1 PAGE 163 EJECT ;***************************************************** ;*  4CBB A2A875 mov unadsk,al ; unadsk = sekdsk 4CBE A19E75 mov ax,sektrk 4CC1 A3A975 mov unatrk,ax ; unatrk = sektrk 4CC4 A0A075  inc una ; unasec = unasec+1 4CF6 8A07 mov al,una ; end of track? 4CF8 8A26B275 mov ah,cpmspt 4CFC FEC4 inc ah 4CFE  * ;* SECTOR BLOCKING / DEBLOCKING * ;* * ;****************************mov al,seksec 4CC7 A2AB75 mov unasec,al ; unasec = seksec ; chkuna: ; check for write to unallocated sector 3AC4 cmp al,ah ; count cp/m sectors 4D00 7207 4D09 jb noovf ; skip if below *r1.133 '83 03/25 ; ; overflow to next t************************* read2d: ; read the selected CP/M sector 4C70 C606A77500 mov unacnt,0 ; clear unallocated counter 4C75 C606AE7501 mov  ; 4CCA BBA775 mov bx,offset unacnt ; point "una" at unacnt 4CCD 8A07 mov al,una 4CCF 84C0 test al,al ; any unalloc remain? 4CD1 743D 4D10 rack 4D02 C60701 mov una,1 ; unasec = 1 4D05 FF06A975 inc unatrk ; unatrk = unatrk+1 noovf: ; match found, mark as un readop,1 ; read operation 4C7A C606AD7501 mov rsflag,1 ; must read data 4C7F C606AF7502 mov wrtype,wrual ; treat as unalloc 4C84 E99F00 4D26 jmp rwoper jz alloc ; skip if not ; ; more unallocated records remain 4CD3 FEC8 dec al ; unacnt = unacnt-1 CP/M ASM86 1.1 SOURCE: USCneccesary read 4D09 C606AD7500 mov rsflag,0 ; rsflag = 0 4D0E EB16 4D26 jmps rwoper ; to perform the write ; alloc:  ; to perform the read ; hduncnt: 4C87 C606B27540 mov cpmspt,hdspt 4C8C C606B17540 mov blksiz,hdblksiz 4C91 EB11 4CA4 jmps wrtBIOS.A86 Customized Basic I/O System V1 PAGE 164 4CD5 8807 mov una,al 4CD7 A09D75 mov al,sekdsk ; same disk? 4CDA BBA875 mo ; not an unallocated record, requires pre-read 4D10 C606A77500 mov unacnt,0 ; unacnt = 0 4D15 C606AD7501 mov rsflag,1 ; rsflag = 1 4D1A 803EB37502 cmp f2d ; write2d: ; write the selected CP/M sector 4C93 803EB37502 cmp fid,2 4C98 74ED 4C87 je hduncnt 4C9A C606B17510 v bx,offset unadsk 4CDD 3A07 cmp al,una ; sekdsk = unadsk? 4CDF 752F 4D10 jnz alloc ; skip if not ; ; disks are %  fid,2 ; if hard disk 4D1F 7405 4D26 je rwoper ; yes ; *** Delete / NEC '84 01/14 *** 4D21 C606AD7500 mov rsflag,0 ; *r1.3A06B268 cmp al,hsthdus ; sekhdus = hsthdus? 4D54 753E 4D94 jnz nomatch ; ; 4D56 A0CE6A mov al,sekhed 4D59 3A06B468  ; *** Flush dirty buffer with correct type for wrtype ; *** Delete / NEC '83 12/26 *** 4D9B C606A37500 mov hstwrt,0 4DA0 E8EB01 4F8E call w_common2d 133 '83 03/25 ; drop through to rwoper ; ;***************************************************** ;*  cmp al,hsthed 4D5D 7535 4D94 jnz nomatch ; ; same disk, same cylinder? 4D5F A0B368 mov al,hstclnd 4D62 3A06CB6A cmp  ; *** Delete / NEC '83 12/26 *** 4DA3 3C00 cmp al,0 4DA5 7403 4DAA je filhst 4DA7 E9C000 4E6A jmp return_rw ; filhst:  * ;* Common code for READ and WRITE follows * ;* * ;***********************************al,sekclnd ; host cylinder same as seek cylinder 4D66 752C 4D94 jnz nomatch ; ; same disk, same track, same buffer? 4D68 A0A175 mov al,sekhs ; may have to fill the host buffer 4DAA A0CA6AA2B268 mov al,sekhdus ! mov hsthdus,al 4DB0 A0CB6AA2B368 mov al,sekclnd ! mov hstclnd,al 4DB6 A0CE6AA2B468 mov al,sekhed ! mov hsthed,al****************** rwoper: ; enter here to perform the read/write CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 165 4D26 Ct 4D6B 3A06A675 cmp al,hstsec ; sekhst = hstsec? ; *** New code / NEC '83 12/26 *** 4D6F 7523 4D94 jnz nomatch ; 4D71 803EAE7501 cmp  4DBC A0A175A2A675 mov al,sekhst ! mov hstsec,al 4DC2 A0AD75 mov al,rsflag 4DC5 84C0 test al,al ; need to read? 4DC7 7437 4E00 jz filhst1 606AC7500 mov erflag,0 ; no errors (yet) 4D2B B400 mov ah,0 4D2D 803EB37502 cmp fid,2 4D32 7203 4D37 jb rwop005 ; if fdd = 2d 4D34 E9readop,1 4D76 7403 4D7B je wrop030 ; if read 4D78 E98A00 4E05 jmp match wrop030: 4D7B A0A375 mov al,hstwrt 4D7E 84C0 test  ; 4DC9 B500 mov ch,0 4DCB 8A1EA675 mov bl,hstsec 4DCF 833E9E7501 cmp sektrk,1 4DD4 740C 4DE2 je filhst0 ; if cylinder = 0 , side = 3401 4E6B jmp rwhdx00 ; if hard disk rwop005: 4D37 A0A075 mov al, seksec ; compute host sector 4D3A D0E8 shr al, 1 4D3C 7302  al,al 4D80 7503 4D85 jnz wrop040 4D82 E98000 4E05 jmp match ; if no "dirty" buffer wrop040: 4D85 C606A37500 mov hstwrt,0 4D8A E80102 4F8E 1 4DD6 8A0EA675 mov cl,hstsec 4DDA FEC9 dec cl 4DDC BA5A72 mov dx,offset xltskew3 4DDF E8D3FD 4BB5 call sectran ; skew facter  4D40 jae rwop010 4D3E FEC0 inc al rwop010: 4D40 A2A175 mov sekhst,al ; host sector to seek ; ;  call w_common2d 4D8D 3C00 cmp al,0 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 166 4D8F 7474 4E05 je match 4D91 E9D600  filhst0: 4DE2 881EB568 mov secter,bl 4DE6 C606E16A15 mov dma_rw,dma_rad ; 4DEB BBB068 mov bx,offset iocb2d 4DEE C706C36AFF00 mov dma_tc,tc2d ; active host sector? 4D43 B001 mov al,1 4D45 8606A275 xchg al,hstact ; always becomes 1 4D49 84C0 test al,al ; was it already? 4D4B 745D 4D 4E6A jmp return_rw ; *** New code end *** nomatch: ; *** RMG / NECIS *** 8-31-83 ; proper disk, but not correct sector 4D94 4DF4 B0C6 mov al,fdc_rad2d ; 4DF6 E82702 5020 call r_w_common ; yes, if 1 4DF9 A2AC75 mov erflag,al 4DFC 3C00 cmp al,0 AA jz filhst ; fill host if not ; ; host buffer active, same as seek buffer? rwop020: 4D4D A0CA6A mov al,sekhdus 4D50  A0A375 mov al,hstwrt 4D97 84C0 test al,al ; "dirty" buffer ? 4D99 740F 4DAA jz filhst ; no, don't need to write nomatch00: %  ; 4DFE 756A 4E6A jne return_rw ; ; filhst1: 4E00 C606A37500 mov hstwrt,0 ; no pending write ; ov cl,seksec ; 4E32 FEC9 dec cl ; 4E34 80E101 and cl,secmsk ; 4E37 7402 4E3B jz match10 ; 4E39 D2E0  return_rw: 4E6A C3 ret ; ;************************************************************ ;* *  match: ; copy data to or from buffer depending on "readop" CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 167 4E05 A0A075  shl al,cl ; match10: 4E3B 0806E66D or wrtvctr,al ; 4E3F 59 pop cx ; ;----------------- ;* HARD DISK COMMON CODE FOR READ AND WRITE FOLLOWS * ;* * ;******************************************************** mov al,seksec ; mask buffer number 4E08 FEC8 dec al 4E0A 250100 and ax,secmsk ; least signif bits are masked 4E0D B107D3E0 mov cl, 7 ! shl ax,cl ------------------------------------------ ; *** Preserve wrtype of dirty buffer ; *** Return to original / NEC '83 12/26 *** 4E40 C606A37501 mov hstwrt,1 ; hstwrt **** ; rwhdx00: 4E6B A19E75 mov ax,sektrk 4E6E B105 mov cl,5 ; cl = 32 = 2^5 4E70 D3E0 shl ax,cl  ; shift left 7 (* 128 = 2**7) ; ; ax has relative host buffer offset ; 4E11 0306DF6A add ax,dma_buff ; ax has buffer address 4E1= 1 (dirty buffer now) ; ******************************************* 4E45 87F7 xchg si,di ; source/dest index swap 4E47 8CD8 mov ax,DS 4E49 8EC0  ; ans (ax) = t1*32 4E72 2BD2 sub dx,dx ; clear dx 4E74 BB1A00 mov bx,26 4E77 F7F3 div bx ; t2 = ( ans(ax)+1)/ 26 5 8BF0 mov si,ax ; put in source index register 4E17 8B3EBF6A mov di,dma_adr ; user buffer is dest if readop ; 4E1B 1E06 push DS  mov ES,ax 4E4B 8E1EC16A mov DS,dma_seg ; setup DS,ES for write ; rwmove: 4E4F FCF3A5 cld ! rep movs AX,AX ; move as 16 bit wor ;----------- 01 / 26 / '83 ------------------ 4E79 3D1000 cmp ax,10h ; 01/26/'83 4E7C 7207 4E85 jb rwhdx005 ; if loader 4E7E 2D1000 sub ax,10h ! push ES ; save segment registers ; 4E1D 8E06C16A mov ES,dma_seg ; set destseg to the users seg ; SI/DI and DS/ES ids 4E52 071F pop ES ! pop DS ; restore segment registers ; ; data has been moved to/from host buffer 4E54 803EAF7501 cmp wrtype,wrdir  ; ;-------------------------------------------- 4E81 0306D56A add ax,hdsot ; add start of track / drive rwhdx005: s swapped ; if write op 4E21 B94000 mov cx,128/2 ; length of move in words 4E24 A0AE75 mov al,readop 4E27 84C0  ; write type to directory? 4E59 A0AC75 mov al,erflag ; in case of errors 4E5C 750C 4E6A jnz return_rw ; no further processing ; CP/M ASM86 1.1 SOURC ; 01/26/'83 4E85 FEC2 inc dl 4E87 8816A175 mov sekhst,dl ; mod = sekhst 4E8B 2BD2 sub dx,dx ; clear dx 4E8D BB0800  test al,al ; which way? 4E29 7524 4E4F jnz rwmove ; skip if read ; ; write operation, mark and switch direction E: USCBIOS.A86 Customized Basic I/O System V1 PAGE 168 ; clear host buffer for directory write 4E5E 84C0 test al,al ; errors? 4E60 75 mov bx,8 4E90 F7F3 div bx ; t3 = t2 / 8 4E92 B400 mov ah,0 ; clear ah 4E94 8816CE6A mov sekhed,dl ; mod = sekhe ;-------------------- *r1.133 '83 03/25 -------------------- 4E2B 51 push cx ; 4E2C B001 mov al,01h ; generate write vector 4E2E 8A0EA075 m08 4E6A jnz return_rw ; skip if so 4E62 C606A37500 mov hstwrt,0 ; buffer written rwmove00: 4E67 E82401 4F8E call w_common2d & d 4E98 A3CC6A mov sekclndh,ax ; t3 = clinder ; rwhdx01: 4E9B A0CE6A mov al,sekhed 4E9E B90200 mov cx,2 4EA1 D3E0 rwtx,hdc_wrt ; write cmd set 4EEF C606A57500 mov hstwrthd,0 4EF4 E8EE02 51E5 call r_w_commonhd ; ( same w_common2d ) 4EF7 3C00 cmp al,0 4EF9 7403 4EFE jBF0 mov si,ax ; put in source index register 4F48 8B3EBF6A mov di,dma_adr ; user buffer is dist if readop 4F4C 1E push ds 4F4D 06  shl ax,cl ; 2^2 4EA3 B90000 mov cx,0 ; clear cx 4EA6 A09D75 mov al,sekdsk 4EA9 A2CA6A mov sekhd_us,al ; unit e hdfil 4EFB E96CFF 4E6A jmp return_rw ; hdfil: 4EFE A1C86A mov ax,sekpmap ; 4F01 A33667 mov hstpmap,ax ; push es ; save segment register 4F4E 8E06C16A mov es,dma_seg ; set destseg to the user seg 4F52 B94000 mov cx,40h ; move in words length 4F55 A0AE ; active sekhst sector 4EAC B001 mov al,1 4EAE 8606A475 xchg al,hstacthd 4EB2 84C0 test al,al ; Was it alredy 4EB4 7448 4EFE  hd error map set 4F04 A0CA6A mov al,sekhdus 4F07 A2BB68 mov hstuatx,al 4F0A A1CC6A mov ax,sekclndh 4F0D A3BC68 mov hstcltx,ax ; cylinder set 75 mov al,readop ; read or write select flag 4F58 BB009C mov bx,9c00h 4F5B 8EDB mov ds,bx ; hard disk buffer segment 4F5D 84C0  jz hdfil rwhdx03: 4EB6 A1C86A mov ax,sekpmap ; CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 169 4EB9 3B063 4F10 A0CE6A mov al,sekhed 4F13 A2BE68 mov hsthdtx,al ; head No set 4F16 A0A175 mov al,sekhst 4F19 A2BF68 mov hstsctx,al ; sector se test al,al 4F5F 750C 4F6D jnz hdmove ; if read ; ; write opration, mask and switch direction ; 4F61 2EC606A57501 mov 667 cmp ax,hstpmap ; sekpmap = hstpmap ? 4EBD 7524 4EE3 jnz hdnomth ; if nomatch 4EBF A0CA6A mov al,sekhdus 4EC2 3A06BB68 cmp al,hstuatxt 4F1C A0AD75 mov al,rsflag 4F1F 84C0 test al,al ; need to read ? 4F21 7412 4F35 jz hdfil1 hdfil0: 4F23 C606BA68B0 mov  cs:hstwrthd,1 ; ( dirty buffer ) 4F67 87F7 xchg si,di ; souce/dist index chenge 4F69 06 push es 4F6A 1E push ds 4F6B 07  ; sekhdus = hstuatx ? 4EC6 751B 4EE3 jnz hdnomth ; if nomatch 4EC8 A1CC6A mov ax,sekclndh 4ECB 3B06BC68 cmp ax,hstcltx ; sekclndh = hstcltx ?  hstrwtx,hdc_red ; set read cmd 4F28 E8BA02 51E5 call r_w_commonhd ; ( same r_w_common ) 4F2B A2AC75 mov erflag,al 4F2E 3C00 cmp al,0 4F30 7403 4F35 pop es 4F6C 1F pop ds ; chenge segment for write setup ; hdmove: 4F6D FC cld 4F6E F3A5 rep movs ax,ax  4ECF 7512 4EE3 jnz hdnomth ; if nomatch 4ED1 A0CE6A mov al,sekhed 4ED4 3A06BE68 cmp al,hsthdtx ; sekhed = hsthdtx ? 4ED8 7509 4EE3 jnz h je hdfil1 4F32 E935FF 4E6A jmp return_rw hdfil1: 4F35 C606A57500 mov hstwrthd,0 hdmth: 4F3A A0A075 mov al,seksec 4F3D FEC8  ; move as words 4F70 07 pop es 4F71 1F pop ds ; same cp/m segment register ; ; data has been moved to/from hodnomth ; if nomatch 4EDA A0A175 mov al,sekhst 4EDD 3A06BF68 cmp al,hstsctx ; sechst = hstsctx ? 4EE1 7457 4F3A jz hdmth hdnomth:  dec al 4F3F 253F00 and ax,hdsmask ; least signif bits are masked CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 170 4F42 B107 st buffer 4F72 803EAF7501 cmp wrtype,wrdir ; write type to directory ? 4F77 A0AC75 mov al,erflag ; in case of error 4F7A 7511 4F8D jnz hdret_rw 4EE3 A0A575 mov al,hstwrthd ; read & write flag 4EE6 84C0 test al,al 4EE8 7414 4EFE jz hdfil ; if dir or read 4EEA C606BA68F0 mov hst mov cl,7 4F44 D3E0 shl ax,cl ; shift left 7 ( * 128 = 2^7 ) ; ; ax has relative host buffer offset ; 4F46 8&  ; clear host buffer for directory write 4F7C 84C0 test al,al ; if error 4F7E 750D 4F8D jnz hdret_rw ; skip if so 4F80 C606BA68F0 mov hst ; 4FDA 84C0 test al,al ; 4FDC 7541 501F jnz com_2dw11 ; if error ; 4FDE B90200 mov cx,vctrcnt ; 4FE1om_2dw11: 501F C3 ret CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 173 eject R_W_COMMON: 5020 88rwtx,hdc_wrt ; write cmd set 4F85 C606A57500 mov hstwrthd,0 ; clear hstwrt 4F8A E85802 51E5 call r_w_commonhd ; ( same w_common2d ) hdret_rw: 4F8D C3  BEE66C mov si,offset pre_buff2d ; 4FE4 BFE66B mov di,offset r_w_buff2d ; 4FE7 06 push es ; 4FE8 1E push ds 4701 MOV BYTE PTR 1[BX],AL ; SET DMA_CH1 5023 8CD8 MOV AX,DS 5025 B10C MOV CL,12 5027 D3E8 SHR AX,CL 5029 A2C56A  ret CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 171 eject w_common2d: 4F8E B500 mov ; 4FE9 07 pop es ; es = ds com_2dw05: 4FEA 51 push cx ; 4FEB D02EE66D shr wrtvctr,1 ; 4FE MOV DMA_CH1,AL ; SET DMA_SND = [DMA_BUFF] + DS(12BITS*16) 502C 8CD8 MOV AX,DS 502E B104 MOV CL,04H 5030 D3E0 SHL AX,CL 5032 0306DF6A  ch,0 4F90 8A1EA675 mov bl,hstsec 4F94 833E9E7501 cmp sektrk,1 4F99 740C 4FA7 je com_2dw01 ; if cylinder = 0 , side = 1 4F9B 8A0EA675 mov cl,hstsec F 7307 4FF8 jnb com_2dw06 ; if filled 4FF1 B94000 mov cx,64 ; 4FF4 F3A5 rep movs ax,ax ; xfer 1 rec (128byte) 4FF6 EB08 5000  ADD AX,DMA_BUFF 5036 A3C66A MOV DMA_SND,AX EXECUTE: 5039 C606D66800 MOV VRYCNT,0 ; VERIFY COUNT CLEAR *R1.131 '82 12/22 EXEC 4F9F FEC9 dec cl 4FA1 BA5A72 mov dx,offset xltskew3 4FA4 E80EFC 4BB5 call sectran ; skew facter com_2dw01: 4FA7 881EB568 mov  jmps com_2dw07 ; com_2dw06: 4FF8 81C68000 add si,128 ; 4FFC 81C78000 add di,128 ; com_2dw07: 5000 59 UTE00: ; *R1.131 '82 12/22 503E 891ED768 MOV LAST_COM,BX ; SAVE LAST CMD BLOCK ; ADDRESS  secter,bl ;-------------------- r1.133 '83 03/25 -------------------- ; *** Delete / NEC '83 12/26 *** com_2dw03: 4FAB F616E66D not wrtvctr  pop cx ; 5001 E2E7 4FEA loop com_2dw05 ; 5003 07 pop es ; com_2dw09: 5004 C606E66D00  OUTERRETRY: 5042 C606D56800 MOV RTCNT,0 ; OUTERRETRY00: 5047 C606D46800 MOV RETRYCNT,0 ; FOR RETRIES RETRY: 504C 8B4 ; 4FAF 8026E66D03 and byte ptr wrtvctr,vctrmsk ; 4FB4 7453 5009 jz com_2dw10 ; 4FB6 C606E16A15 mov dma_rw,dma_rad ; read parameter set 4FBB BBB068  mov wrtvctr,0 ; clear write vector CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 172 com_2dw10: ;---------------702 MOV AX,2[BX] 504F A3C868 MOV WORD PTR SEEKU,AX 5052 BBC668 MOV BX,OFFSET SEEKCMD 5055 E85301 51AB CALL SENDCOM ; EXECUTE SEEK 5058 E8 mov bx,offset iocb2d ; 4FBE C706C36AFF00 mov dma_tc,tc2d ; 4FC4 B0C6 mov al,fdc_rad2d ; 4FC6 FF36DF6A push dma_buff ; 4FCA C706DF6AE66------------------------------------------- 5009 B90000 mov cx,0 ; now, set track zero 500C C706C36AFF00 mov dma_tc,tc2d ; 5012 C606E16A19 mov dma_rw,dma_wrt A3FA 4AFE CALL SENS 505B 3C00 CMP AL,0 505D 7403 5062 JE SEND_DMA 505F E9AD00 510F JMP EXEC050 ; *R1.131 '82 12/22 C mov dma_buff,offset pre_buff2d ; 4FD0 E84D00 5020 call r_w_common ; read one sector 4FD3 8F06DF6A pop dma_buff ; 4FD7 A2AC75 mov erflag,al  ; dma (memory to i/o) 5017 BBB068 mov bx,offset iocb2d ; 501A B0C5 mov al,fdc_wrt2d ; 501C E80100 5020 call r_w_common ; c'  ; SET UP DMA SEND_DMA: 5062 A1C66A MOV AX,DMA_SND 5065 E603 OUT 03H,AL ; SEND LOW BYTE OF DMA ADDRESS 5067 8AC4 MOV AL,A CALL VRYSET ; VERIFY COMMAND SET 50B4 E987FF 503E JMP EXECUTE00 ; READ AFTER WRITE EXEC010: 50B7 E96E00 5128 JMP Z_RET ; NORMAL RETURN  ; RESET VERIFY COMMAND 510C E92FFF 503E JMP EXECUTE00 ; EXEC050: ;--------------------------------------------------------------------- 510F E85900 H 5069 E603 OUT 03H,AL ; SEND HIGH BYTE 506B A1C36A MOV AX,DMA_TC 506E E613 OUT 13H,AL 5070 8AC4 MOV AL,AH 5072 E613  ;------------------------------------------------------------------ EXEC030: 50BA FE06D468 INC RETRYCNT 50BE 803ED46808 CMP RETRYCNT,8 ; IF RETRY COUN 516B CALL ERRMSG 5112 E8D2D9 2AE7 CALL CONIN CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 175 ; 5115 3C52  OUT 13H,AL ; TC SET 5074 A0E16A MOV AL,DMA_RW ; R/W SET 5077 E61B OUT 1BH,AL ; WRITE MODE SET 5079 A0C56A MOV AL,DMA_CHT = 8 50C3 7277 513C JB RETRY_L0 ; *R1.131 '82 12/24 50C5 FE06D568 INC RTCNT ; 50C9 803ED56803 CMP RTCNT,3 ; 50CE 7320  CMP AL,'R' 5117 7412 512B JE RETRY_L ; RETRY 10H MORE TIMES 5119 3C72 CMP AL,'r' 511B 740E 512B JE RETRY_L 511D 3C49 CMP AL,'I' 1 507C E63A OUT 3AH,AL ; DMA CH1 REG FILE 507E B001 MOV AL,01H 5080 E60B OUT 0BH,AL ; MASK RESET 5082 8B1ED768 MOV BX, 50F0 JNB EXEC040 ; *R1.131 '82 12/24 50D0 8B1ED768 MOV BX,LASTCOM ; 50D4 8A4702 MOV AL,2[BX] ; US 50D7 2403 AND511F 7407 5128 JE Z_RET ; IGNORE ERROR 5121 3C69 CMP AL,'i' 5123 7403 5128 JE Z_RET EXEC_ERR: 5125 0CFF OR AL,25LASTCOM 5086 E82201 51AB CALL SENDCOM ; TRANSMIT COMMAND TO FDC 5089 B90700 MOV CX,07H ; CX = STATUS FETCH LENGTH CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O Syst AL,03H 50D9 A2C568 MOV HOMERU,AL ; 50DC BBC368 MOV BX,OFFSET HOMER 50DF E8C900 51AB CALL SENDCOM ; SEND SEEK CMD 50E2 E819FA 4AFE CALL 5 ; SET CODE FOR ; PARAMETER ERROR EXEC_EXIT: 5127 C3 RET Z_RET: 5128 2400 em V1 PAGE 174 508C E83A01 51C9 CALL EXECPOLL 508F 8A265869 MOV AH,STATUS0 5093 A05969 MOV AL,STATUS1 5096 25FFF8 AND AX SENS ; SENSE SEEK END 50E5 3C00 CMP AL,0 50E7 7526 510F JNE EXEC050 ; *R1.131 '82 12/24 50E9 8B1ED768 MOV BX,LASTCOM ; AND AL,0 512A C3 RET ; RETURN WITH NO ERROR CODE RETRY_L: ;----------------- R1.131 '82 12/22 --------------------------------- 512B 803EE16A11 ,0F8FFH ; IF ST0,ST1 ALARM 5099 751F 50BA JNZ EXEC030 509B 80265A69BF AND STATUS2,0BFH ; IF STATUS2 ALARM (IGNORE DDM) 50A0 7518 50BA JNZ EXEC030 ; IF 50ED E957FF 5047 JMP OUTER_RETRY00 ; ; EXEC040: ;----------------- R1.131 '82 12/24 ---------------------------------- 50F0 803EE16A15  CMP DMA_RW,DMA_VRY 5130 7503 5135 JNE RETRY_L1 ; IF NOT VERIFY 5132 E82200 5157 CALL VRYRESET ; RETRY_L1: ;------------ ERROR ; IF NORMAL ;----------------- R1.131 82' 12/24 ------------------------------- 50A2 803EE16A19 CMP DMA_RW,DMA_WRT ; 50A7 750E CMP DMA_RW,DMA_RAD ; 50F5 7418 510F JE EXEC050 ; IF READ 50F7 803EE16A19 CMP DMA_RW,DMA_WRT ; 50FC 7411 510F JE EXEC050 ; IF WRITE 50-------------------------------------------------------- 5135 8B1ED768 MOV BX,LASTCOM 5139 E9FDFE 5039 JMP EXECUTE ; *R1.131 '82 12/22 RETRY_L0: 513C 8B1ED7 50B7 JNE EXEC010 ; IF NOT WRITE 50A9 2E803E882500 CMP FDRAWF,0 ; 50AF 7506 50B7 JNE EXEC010 ; IF NOT READ AFTER WRITE 50B1 E88F00 5143 FE FE06D668 INC VRYCNT ; IF VERIFY 5102 803ED66802 CMP VRYCNT,2 ; 5107 7306 510F JNB EXEC050 ; 5109 E84B00 5157 CALL VRYRESET' 68 MOV BX,LASTCOM ; 5140 E909FF 504C JMP RETRY ;---------------- R1.131 '82 12/22 -------------------------------------- VRYSET: 5143 C606E16A11  IF LOADER_BIOS ;------------------------------------------------ MOV ERR_FLG,1 ;------------------------------------------------  ; ; EXECPOLL : 51C9 BF5869 MOV DI, OFFSET STATUS0 ; DI = STATUS TABLE ADDR 51CC 8BF7 MOV SI,DI ; SAVE POINTER  MOV DMA_RW,DMA_VRY ; VERIFY 5148 8B1ED768 MOV BX,LASTCOM ; 514C 8A4701 MOV AL,1[BX] ; 514F 24FC AND AL,0FCH ;  ENDIF ; LOADER_BIOS 518C E85AF7 48E9 CALL PMSG 518F C3 RET CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 178  EXECP010: 51CE E450 IN AL,50H ; GET FDC STATUS REG 51D0 0440 ADD AL,40H 51D2 73FA 51CE JAE EXECP010 ; RQM, DIO = OFF / 51D4 5151 0C02 OR AL,02H ; FDC = READ 5153 884701 MOV 1[BX],AL ; 5156 C3 RET VRYRESET: 5157 C606E16A19 MOV  EJECT ; 4BIT BINARY TO ASCII HEX CODE HEX: 5190 B700 MOV BH,0H 5192 8AC3 MOV AL,BL 5194 B104 MOV CL,04H 5196 D2EB  E452 IN AL,52H ; GET STATUS 51D6 AA STOS BYTE PTR [SI] ; SAVE STATUS 51D7 8A04 MOV AL,[SI] ; AL = ST0 51D9 D0E0  DMA_RW,DMA_WRT ; WRITE 515C 8B1ED768 MOV BX,LASTCOM ; 5160 8A4701 MOV AL,1[BX] ; 5163 24FC AND AL,0FCH ; 5165 0C01  SHR BL,CL 5198 8A9FD968 MOV BL,HEXTBL[BX] 519C 881D MOV [DI],BL 519E 8AD8 MOV BL,AL 51A0 80E30F AND BL,0FH 51A3 8A9FD968  SHL AL,1 51DB 7304 51E1 JAE EXECP020 ; IF NORMAL END 51DD D0E0 SHL AL,1 51DF 7302 51E3 JAE EXECP030 ; NORMAL END EXECP020: OR AL,01H ; FDC = WRITE 5167 884701 MOV BYTE PTR 1[BX],AL ; 516A C3 RET CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I MOV BL,HEXTBL[BX] 51A7 47 INC DI 51A8 881D MOV [DI],BL 51AA C3 RET SENDCOM: 51AB E450 IN AL,50H  51E1 E2EB 51CE LOOP EXECP010 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 179 EXECP030: 51E3 C3 ret 51E4 C3/O System V1 PAGE 176 ;------------------------------------------------------------------------- CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1  ; GET STATUS REG 51AD A810 TEST AL,10H ; IF FDC BUSY 51AF 75FA 51AB JNZ SENDCOM ; BUSY 51B1 B500 MOV CH,0 51B3 8A0F MOV  NULL: RET ; = include hddisk.lib CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 180 =  PAGE 177 EJECT ERRMSG: ; GENERATE FDC H/W ERROR MESSAGE 516B 8A1E5869 MOV BL,STATUS0 516F BF0569 MOV DI,OFFS CL,[BX] 51B5 8BF3 MOV SI,BX 51B7 46 INC SI 51B8 FC CLD SENDC010: 51B9 E450 IN AL,50H ; GET STATUS REG EJECT = ;**************************************************************** = ;* MODULE NAME : R_W_COMMONHD * = ;* CREATE DATE : '83 05/23 ET ST0 ; STATUS 0 5172 E81B00 5190 CALL HEX ; 5175 8A1E5969 MOV BL,STATUS1 5179 BF1469 MOV DI,OFFSET ST1 517C E81100 5190 CALL HEX  51BB D0E0 SHL AL,1 ; IF RQM ON 51BD 73FA 51B9 JAE SENDC010 51BF D0E0 SHL AL,1 ; & DIO OFF 51C1 72F6 51B9 JB SENDC010  * = ;* REVISION : 001.01 * = ;* AUTHOR : Y.KOZONO * = ;* FUNCTION  ; 517F 8A1E5A69 MOV BL,STATUS2 5183 BF2369 MOV DI,OFFSET ST2 5186 E80700 5190 CALL HEX 5189 BBE968 MOV BX,OFFSET FDERRMSG  51C3 AC LODS BYTE PTR [SI] ; THEN AL = [SI],SI+1 51C4 E652 OUT 52H,AL 51C6 E2F1 51B9 LOOP SENDC010 ; IF CX = 0 51C8 C3 RET (  : HARD DISK R/W COMMON * = ;**************************************************************** = ; = CSEG $ = ; = DRW050: =5223 A1BA68 MOV AX,WORD PTR HSTRWTX ; CMD CODE + UA =5226 0AE0 OR AH,AL ; =5228 88261567 MOV HDRWCMD,AH ; =522C B419  ; NEXT TRACK =5280 8B07 MOV AX,[BX] ; =5282 39064167 CMP HDTRWK,AX ; =5286 7519 52A1 JNE HDRW090 ; IF NEXT TRACK IS BAD =  ;**************************************************************** = ;* HARD DISK R/W COMMON ROUTINE * = ;**************************************************************** = MOV AH,19H ; =522E 3CF0 CMP AL,0F0H ; =5230 7402 5234 JE HDRW060 ; IF WRITE MODE = HDRW055: =5232 B415 MOV  HDRW080: =5288 FE0E4067 DEC HDSMAPWK ; BAD TRACK REMAINDER - 1 =528C 83C302 ADD BX,2 ; =528F 891E3E67 MOV HDPMAPWK,BX ;  ; = R_W_COMMONHD: =51E5 A1BC68 MOV AX,HSTCLTX ; AX = CYLINDER NUMBER =51E8 B103 MOV CL,3 ; =51EA D3E0 SHL  AH,15H ; IF READ MODE = HDRW060: =5234 88262467 MOV HDDMA_RW,AH ; DMA MODE SET CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 ERROR MAP POINT + 2 =5293 FF064167 INC HDTRWK ; R/W POINT + 1 =5297 8B07 MOV AX,[BX] ; =5299 39064167 CMP HDTRWK,AX ; =529D 74E9 5AX,CL ; AX * 8 =51EC 0A06BE68 OR AL,HSTHDTX ; AX + TRACK =51F0 A33B67 MOV HDTRSV,AX ; TRACK NUMBER =51F3 2AED SUB CH,CH  PAGE 181 =5238 A13B67 MOV AX,HDTRSV ; =523B A34167 MOV HDTRWK,AX ; =523E E8CE01 540F CALL HDSETCOM ; HDC COMMAND SET =5241 803E3A6700288 JE HDRW080 ; IF NEXT TRACK IS BAD =529F EB0B 52AC JMPS HDRW100 ; = HDRW090: =52A1 A04367 MOV AL,SCNTWK ; =52A4 00061B67 ; =51F5 8B1E3667 MOV BX,HSTPMAP ; BX = ERROR MAP POINT =51F9 8A0F MOV CL,[BX] ; CX = ERROR COUNT =51FB 83C302 ADD BX,2 ; ERROR MAP ADDRE CMP HDSMAPSV,0 ; =5246 7459 52A1 JE HDRW090 ; IF NOT HAVE BAD TRACK =5248 8B1E3867 MOV BX,HDPMAPSV ; =524C A03A67 MOV AL,HDSMAP ADD SCNT,AL ; =52A8 28064367 SUB SCNTWK,AL ; = HDRW100: =52AC E8AF01 545E CALL HDSEEK ; SEEK COMMAND OUT =52AF 7478 5329 SS =51FE E311 5211 JCXZ HDRW025 ; NO ERROR = ; = HDRW020: =5200 8B07 MOV AX,[BX] ; =5202 39063B67 CMP HDTRSV,ASV ; =524F A24067 MOV HDSMAPWK,AL ; =5252 B01A MOV AL,26 ; =5254 2A061A67 SUB AL,LSN ; =5258 A21B67 MOV  JZ HDERROR ; IF SEEK ERROR =52B1 BB1467 MOV BX,HDIOCB ; =52B4 E8C201 5479 CALL HDPIO ; R/W COMMAND OUT =52B7 0BDB OR BX,BX X ; =5206 7209 5211 JB HDRW025 ; =5208 FF063B67 INC HDTRSV ; =520C 83C302 ADD BX,2 ; ERROR POINT + 2 =520F E2EF 5 SCNT,AL ; =525B 28064367 SUB SCNTWK,AL ; =525F FF064167 INC HDTRWK ; NEXT TRACK =5263 8B07 MOV AX,[BX] ; =5265 3906416 ; =52B9 746E 5329 JZ HDERROR ; IF NON AVAILABLE =52BB 8B07 MOV AX,[BX] ; AX = STR/EST =52BD 2460 AND AL,60H ; =52BF 3200 LOOP HDRW020 ; = HDRW025: =5211 891E3867 MOV HDPMAPSV,BX ; SAVE ERROR MAP POINT =5215 880E3A67 MOV HDSMAPSV,CL ; SAVE ERROR MAP COUNT 7 CMP HDTRWK,AX ; =5269 741D 5288 JE HDRW080 ; IF NEXT TRACK IS BAD = HDRW070: =526B 803E43671A CMP SCNTWK,26 ; =5270 762F C40 CMP AL,40H ; =52C1 740A 52CD JE HDRW110 ; IF NORMAL END =52C3 F6C480 TEST AH,80H ; =52C6 7423 52EB JZ HDRW150  = HDRW030: =5219 C606D56800 MOV RTCNT,0 ; RETRY COUNTER = HDRW040: =521E C606D46800 MOV RETRYCNT,0 ; RETRY CONNTER = H 52A1 JBE HDRW090 ; REMAINDER < 26 SECTOR =5272 80061B671A ADD SCNT,26 ; =5277 802E43671A SUB SCNTWK,26 ; =527C FF064167 INC HDTRWK(  ; IF ERROR =52C8 E8C100 538C CALL HDEOC ; END OF CYLINDER PROC. CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 182 =52CB 751E ROR ; IF SEEK ERROR =5316 F6C480 TEST AH,80H ; =5319 740E 5329 JZ HDERROR ; IF NOT SEEK END =531B E900FF 521E JMP HDRW040 ; RETRROR ; IF NON AVAILABLE =5355 8B07 MOV AX,[BX] ; AX = STR/IST =5357 2460 AND AL,60H ; =5359 3C40 CMP AL,40H ; = 52EB JNZ HDRW150 ; IF ERROR = HDRW110: =52CD 803E436700 CMP SCNTWK,0 ; =52D2 7405 52D9 JE HDRW120 ; IF END =52D4 E88E00 5RY = HDRW160: =531E A0BB68 MOV AL,HSTUATX ; =5321 0CC0 OR AL,0C0H ; AL = CHECK CMD CODE + UA =5323 A21567 MOV HDRWCMD,AL 535B 75CC 5329 JNE HDERROR ; IF SEEK ERROR =535D F6C480 TEST AH,80H ; =5360 74C7 5329 JZ HDERROR ; IF NOT SEEK END =5362 E9B4FE 5219 365 CALL HDTRCV ; =52D7 EB92 526B JMPS HDRW070 ; = HDRW120: =52D9 803E246719 CMP HDDMA_RW,19H ; =52DE 7508 52E8 JNE H ; =5326 E909FF 5232 JMP HDRW055 ; = ; = HDERROR: =5329 0BDB OR BX,BX ; =532B 7505 5332 JNZ HDER010  JMP HDRW030 ; RETRY = ; = HDTRCV: =5365 A14167 MOV AX,HDTRWK ; =5368 50 PUSH AX ; =5369 B103 DRW130 ; IF NOT WRITE =52E0 2E803E882500 CMP FDRAWF,00H ; =52E6 7436 531E JE HDRW160 ; IF READ AFTER WRITE = HDRW130: =52E8 2400  ; =532D E8D000 5400 CALL HDTMOMSG ; IF NON AVAILABLE =5330 EB16 5348 JMPS HDERR_RET ; = HDER010: =5332 E89500 53CA CALL HDERRMSG  MOV CL,3 ; =536B D3E8 SHR AX,CL ; AX = CYLINDER NUMBER =536D 86C4 XCHG AL,AH ; =536F A32267 MOV WORD PTR  AND AL,0 ; =52EA C3 RET ; NORMAL RETURN = ; = HDRW150: =52EB FE06D468 INC RETRYCNT ; =52EF 803 ; OUTPUT ERROR MESSAGE =5335 E8AFD7 2AE7 CALL CONIN ; CONSOLE INPUT =5338 3C52 CMP AL,52H ; - R - =533A 740F 534B JE HDRETRY ; =533SLCNH,AX ; CYLINDER NUMBER FOR SEEK =5372 0DFE00 OR AX,00FEH ; =5375 A31767 MOV WORD PTR LCNH,AX ; CYLINDER NUMBER FOR R/W =5378 58 POP AX ED46808 CMP RETRYCNT,8 ; =52F4 7403 52F9 JE HDRW155 ; =52F6 E92AFF 5223 JMP HDRW050 ; SEEK & R/W RETRY = HDRW155: =52F9 FE06D56C 3C72 CMP AL,72H ; - R - CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 183 =533E 740B 534B JE HDRETRY  ; =5379 2407 AND AL,07H ; AL = HEAD ADDRESS =537B A21967 MOV LHN,AL ; =537E A21667 MOV PHN,AL ; =5381 C7061A670000 8 INC RTCNT ; =52FD 803ED56803 CMP RTCNT,3 ; =5302 7425 5329 JE HDERROR ; IF R/W ERROR =5304 BB1C67 MOV BX,HDHOMER  ; =5340 3C49 CMP AL,49H ; - I - =5342 74A4 52E8 JE HDRW130 ; =5344 3C69 CMP AL,69H ; - I - =5346 74A0 52E8 JE  MOV WORD PTR LSN,0000H ; NEXT R/W POINT SET =5387 8B1E3E67 MOV BX,HDPMAPWK ; =538B C3 RET ; = ; = HDEOC:  ; =5307 E86F01 5479 CALL HDPIO ; RECALIBRATE COMMAND OUT =530A 0BDB OR BX,BX ; =530C 741B 5329 JZ HDERROR ; IF NON AVAILABLE =5 HDRW130 ; = HDERR_RET: =5348 0CFF OR AL,0FFH ; ABORT (CANSEL) =534A C3 RET = ; = HDRETRY: =534B BB1C67 ; END OF CYLINDER PROC. =538C C606166700 MOV PHN,00H ; =5391 C606196700 MOV LHN,00H ; =5396 C6061A6700 MOV LSN,00H ; 30E 8B07 MOV AX,[BX] ; AX = STR/IST =5310 2460 AND AL,60H ; =5312 3C40 CMP AL,40H ; =5314 7513 5329 JNE HDER MOV BX,HDHOMER ; =534E E82801 5479 CALL HDPIO ; RECALIBRATE COMMAND OUT =5351 0BDB OR BX,BX ; =5353 74D4 5329 JZ HDE) =539B 8A4707 MOV AL,7[BX] ; =539E A21B67 MOV SCNT,AL ; =53A1 8B4703 MOV AX,3[BX] ; CYLINDER =53A4 A31767 MOV WORD P MOV SI,BX ; =53E0 41 INC CX ; CX = HDNST + 2 =53E1 41 INC CX ; CX = HDNST + 2 =53E2 4E DEC S0 MOV AH,AL ; =5414 0C68 OR AL,68H ; =5416 A22167 MOV HDSKCMD,AL ; SEEK CMD CODE + UA SET =5419 80CC50 OR ATR LCNH,AX ; =53A7 2501FF AND AX,0FF01H ; CYLINDER FOR SEEK =53AA A32267 MOV WORD PTR SLCNH,AX ; =53AD E8AE00 545E CALL HDSEEK ; SEEK COMMAND OUT I ; =53E3 BF6067 MOV DI,OFFSET HDSTR+7 ; = HDERM010: =53E6 8A1C MOV BL,[SI] ; BL = A STATUS =53E8 51 PUSH CX H,50H ; =541C 88261D67 MOV RECHD,AH ; REC. CMD + UA SET =5420 A0BF68 MOV AL,HSTSCTX ; =5423 FEC8 DEC AL ; ( FROM ZERO  =53B0 7415 53C7 JZ HDEOC010 ; IF SEEK ERROR =53B2 BB1467 MOV BX,HDIOCB ; CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1  ; =53E9 E8A4FD 5190 CALL HEX ; HEX -> ASCII =53EC 59 POP CX ; =53ED 46 INC SI ; =53EE 83C70C ) =5425 A21A67 MOV LSN,AL ; SECTOR NUMBER =5428 A14167 MOV AX,HDTRWK ; =542B 50 PUSH AX ; =542C B103 MOV  PAGE 184 =53B5 E8C100 5479 CALL HDPIO ; R/W COMMAND OUT =53B8 0BDB OR BX,BX ; =53BA 740B 53C7 JZ HDEOC010 ; IF NON AVAILABLE =53BC ADD DI,12 ; =53F1 E2F3 53E6 LOOP HDERM010 ; =53F3 BB4467 MOV BX,OFFSET HDMSG ; =53F6 E8F0F4 48E9 CALL PMSG ; DISPLAY STA CL,3 ; =542E D3E8 SHR AX,CL ; AX = CYLINDER NUMBER =5430 86C4 XCHG AL,AH ; =5432 A32267 MOV WORD PTR SLCNH,AX ; CYLIND 8A07 MOV AL,[BX] ; AL = STR =53BE 2460 AND AL,60H ; =53C0 3C40 CMP AL,40H ; =53C2 7503 53C7 JNE HDEOC010 TUS =53F9 BB2A69 MOV BX,OFFSET ST2+7 ; =53FC E8EAF4 48E9 CALL PMSG ; DISPLAY RETRY MESSAGE =53FF C3 RET ; = ; =ER NUMBER FOR SEEK =5435 0DFE00 OR AX,00FEH ; =5438 A31767 MOV WORD PTR LCNH,AX ; CYLINDER NUMBER FOR R/W =543B 58 POP AX ; =543C 2407  ; =53C4 2AC0 SUB AL,AL ; =53C6 C3 RET ; NORMAL END = HDEOC010: =53C7 0CFF OR AL,0FFH  HDTMOMSG: =5400 A0BB68 MOV AL,HSTUATX ; =5403 0C30 OR AL,30H ; AL = UNIT ADDRESS (ASCII) =5405 A26668 MOV HDUNMSG,AL  AND AL,07H ; AL = HEAD ADDRESS =543E A21967 MOV LHN,AL ; =5441 A21667 MOV PHN,AL ; =5444 C6061B6700 MOV SCNT,0  ; =53C9 C3 RET ; ERROR = ; = HDERRMSG: =53CA B92C00 MOV CX,44 ; =53CD 8B363467 MOV SI,HDPS ; =5408 BB5068 MOV BX,HDMSG2 ; =540B E8DBF4 48E9 CALL PMSG ; =540E C3 RET ; = ; =  ; =5449 8A263D67 MOV AH,SCNTSV ; =544D 88264367 MOV SCNTWK,AH ; =5451 2AC0 SUB AL,AL ; =5453 48 DEC TM ; =53D1 BF7367 MOV DI,OFFSET HDSTR+26 ; =53D4 06 PUSH ES ; =53D5 1E PUSH DS ; =53D6 07 POP ;**************************************************************** = ;* HARD DISK COMMAND & PARAMETERS SET UP * CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1  AX ; AX = TC =5454 A32767 MOV HDDMA_TC,AX ; =5457 BB2467 MOV BX,HDDMA ; =545A E86F01 55CC CALL HDWDMA ; DMA REGISTER WRIT ES ; =53D7 F3A5 REP MOVS AX,AX ; STR MSG COPY =53D9 07 POP ES =53DA 8B0E3267 MOV CX,HDNST ; NUMBER OF STATUS =53DE 8BF3  PAGE 185 = ;**************************************************************** = ; = HDSETCOM: =540F A0BB68 MOV AL,HSTUATX ; =5412 8AE) E =545D C3 RET ; = ; = ;**************************************************************** = ;* HARD DISK SEEK A POINT * = ;**************************************************************** = ; = HDPIO: =5479 06 PUSH ES ; =5 ; BX = DISK STATUS AREA POINTER =54AE 07 POP ES ; =54AF C3 RET ; = HDPIO020: =54B0 2BDB SUB BX,BX  * = ;**************************************************************** = ; = HDSEEK: =545E BB2067 MOV BX,HDSKCB ; =5461 E81500 47A 1E PUSH DS ; =547B 07 POP ES ; ES <- DS =547C FC CLD ; =547D B000 MOV AL,00H  ; =54B2 07 POP ES ; =54B3 C3 RET ; = ; = ;******************************************************** 5479 CALL HDPIO ; SEEK COMMAND OUT =5464 0BDB OR BX,BX ; =5466 740E 5476 JZ HDSK010 ; IF NON AVAILABLE =5468 8B07 MOV ; =547F E696 OUT HDIRIN,AL ; INT RESET =5481 2AED SUB CH,CH ; =5483 8A0F MOV CL,[BX] ; CL = COMMAND PHASE SIZE =5******** = ;* HDC COMMAND PHASE * = ;* ENTRY PARAMETERS : * = ;* REG.BX : COMMAND PHASE ADDRES AX,[BX] ; AX = STR/IST =546A 2460 AND AL,60H ; =546C 3C40 CMP AL,40H ; =546E 7506 5476 JNE HDSK010 ; IF SEEK ERR485 43 INC BX ; BX = COMMAND PHASE POINTER =5486 49 DEC CX ; =5487 E82A00 54B4 CALL HDPOUT ; HDC OUT =548A 0AC0 S * = ;* REG.CX : COMMAND PHASE LENGTH (FROM 0) * CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 188 = OR =5470 F6C480 TEST AH,80H ; =5473 7401 5476 JZ HDSK010 ; IF NOT SEEK END =5475 C3 RET ; = HDSK010: = OR AL,AL ; =548C 7522 54B0 JNZ HDPIO020 ; UNIT NON AVAILABLE = HDPIO010: =548E E496 IN AL,HDIRIN ; =5490 A802  ;**************************************************************** = ; = HDPOUT: =54B4 E33D 54F3 JCXZ HDPO030 ; =54B6 803E096700 CMP HDFMTFG,00H 5476 2AE4 SUB AH,AH ; SET ZERO-FLAG CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 186 =5478 C3 RET  TEST AL,02H ; =5492 74FA 548E JZ HDPIO010 ; IF HDEX ON =5494 2AFF SUB BH,BH ; =5496 8A1E2967 MOV BL,HDCMDSV ; B ; =54BB 741C 54D9 JE HDPO015 ; IF NOT FMT =54BD 51 PUSH CX ; =54BE B91300 MOV CX,19 ; 5 SEC =  ; = ; = ; CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 187 = EJECT = L = LAST COMMAND =549A 80E3F0 AND BL,0F0H ; =549D B103 MOV CL,3 ; =549F D2EB SHR BL,CL ; =54A1 8B9F8168 MOV  HDPO005: =54C1 51 PUSH CX ; =54C2 B90080 MOV CX,8000H ; = HDPO010: =54C5 B040 MOV AL,40H ; =54C7 E6A2; = ;**************************************************************** = ;* HDC/FMT OUT * = ;* ENTRY PARAMETERS :  BX,HDINTTBL[BX] ; BX = INTERRUPT ADDRESS =54A5 FFD3 CALL BX ; STATUS READ = ;---------------------- ,83 02/17 ---------------------- =54A7 0AC0 OR AL OUT HDFIR0,AL ; CLDB WRITE =54C9 E4A2 IN AL,HDFIR0 ; =54CB A820 TEST AL,20H ; =54CD 7508 54D7 JNZ HDPO013  * = ;* REG.BX : DISK IOCB ADDRESS * = ;* RETURNED VALUE : * = ;* REG.BX : STATUS ARE,AL ; =54A9 7505 54B0 JNZ HDPIO020 ; UNIT NON AVAILABLE = ;------------------------------------------------------- =54AB BB2A67 MOV BX,HDPSTS *  ; IF DACKH ON =54CF E2F4 54C5 LOOP HDPO010 ; =54D1 59 POP CX ; =54D2 E2ED 54C1 LOOP HDPO005 ; =54D4 59  I/O System V1 PAGE 189 =5505 E4A2 IN AL,HDFIR0 ; GET CE FLAG =5507 A804 TEST AL,04H ; CHECK IF CE = OFF =5509 7408 5513 AL,HDFIR0 ; =552D A804 TEST AL,04H ; CHECK CE = OFF =552F 75FA 552B JNZ DSI005 = DSI010: = ;--------------------- ,83 02/17 ----- POP CX ; =54D5 EB39 5510 JMPS HDPO037 ; IF NON AVAILABLE = HDPO013: =54D7 59 POP CX ; =54D8 59 PO JZ HDPO040 ; IF CE = OFF =550B E2F4 5501 LOOP HDPO035 ; =550D 59 POP CX ; =550E E2ED 54FD LOOP HDPO033 ; --------------- =5531 B91300 MOV CX,19 ; 5 SEC = DSI012: =5534 51 PUSH CX ; =5535 B90080 MOV CX,8000H ; P CX ; = HDPO015: =54D9 53 PUSH BX ; =54DA 49 DEC CX ; =54DB 43 INC BX  = HDPO037: =5510 0CFF OR AL,0FFH ; NON AVAILABLE =5512 C3 RET ; = HDPO040: =5513 59 POP  = DSI015: =5538 E496 IN AL,HDIRIN ; STATUS READ =553A A802 TEST AL,02H ; =553C 7508 5546 JNZ DSI020 ; IF HDIN OF ; = HDPO020: =54DC 8A07 MOV AL,[BX] ; =54DE E6A0 OUT HDHDBF,AL ; 1 PARAMETER WRITE =54E0 43 INC BX  CX ; =5514 8A07 MOV AL,[BX] ; =5516 A22967 MOV HDCMDSV,AL ; COMMAND SAVE =5519 E692 OUT HDHCMW,AL ; COMMAND WRITE F =553E E2F8 5538 LOOP DSI015 ; =5540 59 POP CX ; =5541 E2F1 5534 LOOP DSI012 ; =5543 B0FF MOV AL,0FFH  ; =54E1 E2F9 54DC LOOP HDPO020 ; =54E3 803E096700 CMP HDFMTFG,00H ; =54E8 7404 54EE JE HDPO025 ; IF NOT FMT =54EA B004 MOV=551B 2AC0 SUB AL,AL ; ACCESS AVAILABLE =551D C3 RET ; = ; = ;***************************************************** ; =5545 C3 RET ; = DSI020: CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 190 =5546 59  AL,04H ; =54EC E6A2 OUT HDFIR0,AL ; EOP WTIRE = HDPO025: =54EE 8A07 MOV AL,[BX] ; =54F0 E6A0 OUT HDHDBF*********** = ;* DISK PHYSICAL I/O INTERRUPT ROUTINES * = ;**************************************************************** = ; = ; =  POP CX ; = ;---------------------------------------------------- =5547 E492 IN AL,HDHSTR ; STR READ =5549 A810 TEST AL,10H ,AL ; LAST PARAMETER WRITE =54F2 5B POP BX ; = HDPO030: =54F3 803E096700 CMP HDFMTFG,00H ; =54F8 7419 5513 JE HDPO04 ;**************************************************************** = ;* SEEK,RECALIBRATE INTERRUPT * = ;******************************************************** ; =554B 74F9 5546 JZ DSI020 ; IF ERROR =554D E81F00 556F CALL HDINTS ; GET INTERRUPT STATUS =5550 C3 RET ; MORMAL RET0 ; IF NOT FMT =54FA B91300 MOV CX,19 ; 5 SEC = HDPO033: =54FD 51 PUSH CX ; =54FE B90080 MOV CX,8000H ******** = ; = HDSINT: =551E E492 IN AL,HDHSTR ; STR READ =5520 803E096700 CMP HDFMTFG,00H ; =5525 740A 5531 JE DSIURN = ; = ;**************************************************************** = ;* READ/WRITE INTERRUPT * = ;***************** ; = HDPO035: =5501 B011 MOV AL,11H ; =5503 E6A2 OUT HDFIR0,AL ; HSRQ CLCE (FMT) CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic010 ; IF NOT FMT =5527 B010 MOV AL,10H ; =5529 E6A2 OUT HDFIR0,AL ; CLCE WRITE (FMT) = DSI005: =552B E4A2 IN * *********************************************** = ; = HDRINT: =5551 C7063467CF67 MOV HDPSTM,OFFSET HDSTM1 ; =5557 B90700 MOV CX,7 ; NUMBER OF RESU=5576 B011 MOV AL,11H ; =5578 E6A2 OUT HDFIR0,AL ; HSRQ & CLCE (FMT) = DIT005: =557A E4A2 IN AL,HDFIR0 =557C A804 FMT =55A8 B020 MOV AL,20H ; =55AA E6A2 OUT HDFIR0,AL ; RSTR ON = DGS010: =55AC E4A2 IN AL,HDFIR0 ; =55AE A82LT STATUS = DRI010: =555A E492 IN AL,HDHSTR ; STATUS REGISTER READ =555C E83800 5597 CALL HDGSTS ; GET RESULT STATUS =555F C3 RET  TEST AL,04H ; CHECK IF CE = OFF =557E 75FA 557A JNZ DIT005 = DIT006: CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 0 TEST AL,20H ; =55B0 74FA 55AC JZ DGS010 ; IF DACKH OFF = DGS020: =55B2 E4A0 IN AL,HDHDBF ; 1 STATUS READ =55B ; = ;**************************************************************** = ;* SENSE UNIT STATUS INTERRUPT * = ;*********************PAGE 191 =5580 B010 MOV AL,HDINTCMD ; =5582 E692 OUT HDHCMW,AL ; INT. STR COMMAND OUT = DIT010: =5584 E496 IN AL,HDIRIN 4 AA STOS BYTE PTR DI ; =55B5 E2FB 55B2 LOOP DGS020 ; = DGS030: =55B7 803E096700 CMP HDFMTFG,00H ; =55BC 740A 55C8 ******************************************* = ; = HDSUNIT: =5560 C70634673568 MOV HDPSTM,OFFSET HDSTM3 ; =5566 B90200 MOV CX,2 ; NUMBER OF RESULT  ; READ INT =5586 A802 TEST AL,02H ; =5588 74FA 5584 JZ DIT010 ; IF HDIN OFF =558A E492 IN AL,HDHSTR ; STATUS REGISTER READ  JE DGS035 ; IF NOT FMT =55BE B010 MOV AL,10H ; =55C0 E6A2 OUT HDFIR0,AL ; CLCE WRITE (FMT) = DGS033: =55C2 E4A2 STATUS =5569 EBEF 555A JMPS DRI010 ; = ; = ;**************************************************************** = ;* SPECIFY INTERRUPT =558C C70634672768 MOV HDPSTM,OFFSET HDSTM2 ; =5592 B90100 MOV CX,1 ; =5595 EB00 5597 JMPS HDGSTS ; GET RESULT STATUS = ; =  IN AL,HDFIR0 =55C4 A804 TEST AL,04H ; CHECK IF CE = OFF =55C6 75FA 55C2 JNZ DGS033 = DGS035: =55C8 2AC0 SUB AL,AL  * = ;**************************************************************** = ; = HDCINT: =556B 2BC9 SUB CX,CX ; NUMBER OF R ;**************************************************************** = ;* GET RESULT STATUS * = ;* ENTRY PARAMETERS :  ; =55CA C3 RET ; = ; = HDNULL: =55CB C3 RET ; UNUSED = ; = ESULT STATUS =556D EBEB 555A JMPS DRI010 ; = ; = ;**************************************************************** = ;* SENSE INTERRUPT STATUS  * = ;* REG.CX : NUMBER OF RESULT STATUS * = ;* REG.DI : STATUS AREA POINTER * = ;****************************************** ;**************************************************************** CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 192 = ;* OUT DMA PARAMETERS  * = ;* ENTRY PARAMETERS : * = ;* REG.DI : STATUS AREA POINTER * = ;************************************* = ; = HDGSTS: =5597 890E3267 MOV HDNST,CX ; =559B BF2A67 MOV DI,HDPSTS ; STATUS AREA POINTER =559E AA  * = ;* ENTRY PARAMETERS : * = ;* REG.BX : DMA IOCB ADDRESS * = ;******************************************************************* = ; = HDINTS: =556F 803E096700 CMP HDFMTFG,00H ; =5574 740A 5580 JE DIT006 ; IF NOT FMT  STOS BYTE PTR DI ; =559F E316 55B7 JCXZ DGS030 ; =55A1 803E096700 CMP HDFMTFG,00H ; =55A6 740A 55B2 JE DGS020 ; IF NOT + ********************************************** = ; = HDWDMA: =55CC 8A07 MOV AL,[BX] ; =55CE E69B OUT HDD_MOD,AL ; DMA MODE WRITE  ; =6712 10 DB 10H ; =6713 00 DB 00H ; = ; = 6714 HDIOCB EQU OFFSET $ =6714 07 D 0000 HDNST DW 0 ; NUMBER OF RESULT STATUS = ; =6734 0000 HDPSTM DW 0 ; STATUS MESSAGE POINTER = ; =6736 0000 HS =55D0 8B4701 MOV AX,1[BX] ; =55D3 E6A3 OUT HDD_ADR,AL ; ADDRESS LOW =55D5 8AC4 MOV AL,AH ; =55D7 E6A3 OUT HDB 07H ; =6715 00 HDRWCMD DB 00H ; =6716 02 PHN DB 02H ; =6717 FE LCNH DB 0FEH ; =6718 00 TPMAP DW 0 ; ERROR MAP POINT =6738 0000 HDPMAPSV DW 0 ; =673A 00 HDSMAPSV DB 0 ; =673B 0000 HDTRSV DW 0 ;D_ADR,AL ; ADDRESS HIGH =55D9 8B4703 MOV AX,3[BX] ; =55DC E693 OUT HDD_TC,AL ; TC LOW =55DE 8AC4 MOV AL,AH ; =55E0 E693 LCNL DB 00H ; =6719 02 LHN DB 02H ; =671A 00 LSN DB 00H ; =671B 01 SCNT DB 01H ; =  TRACK NUMBER FOR R/W =673D 20 SCNTSV DB 20H ; 32 SECTORS (8K) =673E 0000 HDPMAPWK DW 0 ; =6740 00 HDSMAPWK DB 0 ; BAD TRACK COUNT  OUT HDD_TC,AL ; TC HIGH =55E2 B001 MOV AL,01H ; =55E4 E6AB OUT HDD_MSK,AL ; MASK WRITE =55E6 C3 RET  ; = 671C HDHOMER EQU OFFSET $ =671C 01 DB 01H ; =671D 50 RECHD DB 50H ; = ; = 671E HDU=6741 0000 HDTRWK DW 0 ; =6743 00 SCNTWK DB 0 ; = ; = 0010 HDINTCMD EQU 10H ; SENSE INTERRUPT STATUS COMMAN ; = ; CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 193 = EJECT = ;********************NIT EQU OFFSET $ =671E 01 DB 01H ; =671F 30 HDUNCMD DB 30H ; = ; = 6720 HDSKCB EQU OFFSET $ =6720 03 D = ; =6744 0D0A0A HDMSG DB CR,LF,LF =6747 48444320482F DB 'HDC H/W ERROR ',CR,LF,LF 57204552524F 5220200D0A0A =6759 434D4420203D HDSTR DB 'CMD = H',CR,LF,LF ******************************************** = ;* DISK PHYSICAL I/O WORK AREA * = ;**************************************************************** = ; = DB 03H ; =6721 00 HDSKCMD DB 00H ; =6722 00 SLCNH DB 00H ; =6723 00 DB 00H ; =  202020480D0A 0A =6766 53545220203D DB 'STR = H ' 202020482020 202020202020 202020202020 2020 =6780 202020202020 DB ' ' 202020202020  DSEG $ = ; =6709 01 HDFMTFG DB 01H ; HDC/FMT FLAG = ; = 670A HDCCMD EQU OFFSET $ =670A 09 D ; = 6724 HDDMA EQU OFFSET $ =6724 00 HDDMA_RW DB 00H ; DMA MODE =6725 0000 HDDMA_AD DW 0000H ; DMA OFFSET =6727 FF1F HDDMA_TC DW 202020202020 202020202020 2020 =679A 202020202020 DB ' ' 202020202020 202020202020 202020202020 2020 =67B4 202020202020 DB ' B 09H ; =670B 20 DB 20H ; SPECIFY COMMAND CODE =670C 5F DB 5FH ; =670D 81 DB 81H ;  TCHD ; DMA TC = ; = ; =6729 00 HDCMDSV DB 00H ; LAST COMMAND SAEV AREA CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1  ',CR,LF,LF,0 202020202020 202020202020 20202020200D 0A0A00 = ; =67CF 45535420203D HDSTM1 DB 'EST = H PHN = H LCNH = H',CR,LF,LF 202020482020 2050484E2020 3D2=670E 00 DB 00H ; =670F 03 DB 03H ; =6710 1A DB 1AH ; =6711 0C DB 0CH  PAGE 194 = ; = 672A HDPSTS EQU OFFSET $ ; =672A RB 8 ; STATUS AREA = ; =6732+ 020204820 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 195 20204C434E48 203D20202048 0D0A0A =67F6 4C434E4C203D DB 'LCNL = H LHN = H  DW HDNULL ; SCAN =689D 5155 DW HDRINT ; VERIFY DATA CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 196 =689 ;* TWO BYTES EACH. THE FUNCTION NUMBER REQUIRES ONLY ONE BYTE. = ;* THE STRUCTURE OF THE PARAMETER MEMORY BLOCK IS: = ;* FNCT# CX VAL DX VAL = ;* SEGMEN' 202020482020 204C484E2020 3D2020204820 2020 =6810 4C534E20203D DB 'LSN = H SCNT = H' 202020482020 2053434E5420 3D20202048 = ; =6827 49535420203D HDSTMF 5155 DW HDRINT ; WRITE DATA = ; = ;*** PORT NO. DEFINITION (DMA) *** = ; = 00A3 HDD_ADR EQU 0A3H ; ADT 40H 510BH 510C,DH 510E,FH = ;* LOW,HIGH LOW,HIGH = ; = ; = ;* BEGIN FUNCTION 50 ROUTINE = ; = 2 DB 'IST = H',CR,LF,LF,0 202020480D0A 0A00 = ; =6835 55535431203D HDSTM3 DB 'UST1 = H UST2 = H',CR,LF,LF,0 202020482020 205553543220 3D202020480D 0A0A00 = DRESS = 0093 HDD_TC EQU 93H ; TC = 00AB HDD_MSK EQU 0ABH ; SINGLE MASK WRITE = 009B HDD_MOD EQU 9BH ; MODE REGISTER WRITE = 00A9 CSEG $ =55E7 1E FUNCT_50: PUSH DS ;SAVE THE CURRENT DS VALUE FROM HLL =55E8 06 PUSH ES ;SAVE THE CURRENT ES VALUE FROM HLL =55E9 16 PUSH SS ;SAVE ; = 6850 HDMSG2 EQU OFFSET $ =6850 0D0A0A DB CR,LF,LF =6853 2A2A2A204861 DB '*** Hard Disk Unit ' 726420446973 6B20556E6974 20 =6866 00 H HDD_CMD EQU 0A9H ; COMMAND WRITE = 009F HDD_AMSK EQU 9FH ; ALL MASK WRITE = ; = ;*** PORT NO. DEFINITION (HDC) *** =  THE CURRENT SS VALUE FROM HLL =55EA B84000 MOV AX,0040H ;GET SEGMENT OF BDOS/CBIOS =55ED 8ED8 MOV DS,AX ;DATA SEG 40H =55EF 8EC0 MOV ES,AX ;EXTRA SEGMENT 40H =55F1 B1DUNMSG DB 00H =6867 3A206973204E DB ': is Not Available ***',CR,LF,LF,0 6F7420417661 696C61626C65 202A2A2A0D0A 0A00 = ; = 6881 HDINTTBL EQU OFFSET $ =6881 CB55 ; = 00A0 HDHDBF EQU 0A0H ; DATA BUFFER = 0092 HDHSTR EQU 92H ; STATUS REGISTER = 0092 HDHCMW EQU 92H ; COMMAND WRITE 32 MOV CL,50 ;SET UP CL FOR FUNCTION 50 CALL = ;**** GRH NECIS 1/30/84 ******************************************* CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1  DW HDNULL ; AUXILIARY =6883 6F55 DW HDINTS ; SENSE INTERRUPT STATUS =6885 6B55 DW HDCINT ; SPECIFY =6887 6055  = ; = ;*** PORT NO. DEFINITION (INT) *** = ; = 0096 HDIRIN EQU 96H ; READ INT = ; = ;*** PORT NO.  PAGE 197 = ;POINT TO PARAMETER MEMORY BLOCK START =55F3 BA0B5B MOV DX,OFFSET SFKEYTBL + 010BH = ;************************************************************* DW HDSUNIT ; SENSE UNIT STATUS =6889 CB55 DW HDNULL ; DETECT ERROR =688B 1E55 DW HDSINT ; RECALIBRATE =688D 1E55 DW DEFINITION (FMT) *** = ; = 00A2 HDFIR0 EQU 0A2H ; IRO = ; END ; = INCLUDE FNCT50.LIB =******* =55F6 CDE0 INT 224 ;CALL BDOS FUNCT 50 = ;* RECOVER ALL OF THE HLL REGISTERS FOR THE RETURN = ; =55F8 17 POP SS =55F9 07  HDSINT ; SEEK =688F 5155 DW HDRINT ; WRITE ID =6891 5155 DW HDRINT ; VERIFY ID =6893 5155 DW HDRINT ; R ;* THIS IS A ROUTINE TO ALLOW A HIGH LEVEL LANGUAGE LIKE BASIC86 = ;* TO ACCESS THE CBIOS FUNCTIONS THROUGH THE CPM-86 FUNCTION 50 = ;* CALL. THREE PARAMETERS ARE PASSED TO THIS ROUTINE: POP ES =55FA 1F POP DS =55FB CB RETF ;RETURN FAR SINCE CALL FAR IS USED CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 EAD ID =6895 CB55 DW HDNULL ; INVALID =6897 5155 DW HDRINT ; READ DATA =6899 5155 DW HDRINT ; CHECK =689B CB55  = ;* FUNCT NUMBER,CX VALUE, AND THE DX VALUE. = ;* ABSOLUTE MEMORY LOCATIONS HAVE BEEN RESERVED FOR THE THREE = ;* PARAMETERS. SINCE CX, AND DX ARE WORD REGISTERS THEY REQUIRE = ,  PAGE 198 EJECT ;********************************************* ;* * ;* Data Areas  DB 80H ; DTL 128 BYTES/SECTOR ; 68B0 09 IOCB2D DB 09H ; TRANSFER LENGTH 68B1 C6 DB 0C6H ; READ CMD 68B2 00 HSTHDUS DB 0 DB 4000H ; EAD HIGH 68D0 38 DB 4238H ; HIGH BYTE CODE WRITE CMD 68D1 45 DB 4045H ; E 68D2 52 DB 4052H ; R 68D3 52  * ;* * ;********************************************* 55FC data_offset equ offset $ ; 0H ; HD,US 68B3 00 HSTCLND DB 00H ; C 68B4 00 HSTHED DB 00H ; H 68B5 00 SECTER DB 00H ; R 68B6 01 DB 01H ; N 68B7 1A DB 4052H ; R 68D4 00 RETRY_CNT DB 0 68D5 00 RTCNT DB 0 68D6 00 VRYCNT DB 0 68D7 0000 LAST_COM DW 0 ; ADDRESS OF LAST COMMAND  ; *** Flag error at assembly time if CS has grown past arbitrary DS start ; *** RMG / NECIS *** 9-12-83 ; if (offset $) GT 5A00h mov cs,0  DB 1AH ; EOT 68B8 0E DB 0EH ; GPL 68B9 FF DB 0FFH ; DTL ; 68BA 00 HSTRWTX DB 0 ; READ & WRITE CMD 68BB 00  ; STRING 68D9 303132333435 HEXTBL DB '0123456789ABCDEF' 363738394142 43444546 68E9 0D0A FDERRMSG DB CR,LF 68EB 46444320482F DB ; >>>>> error! code segment has grown past 5A00h endif DSEG $ ; org data_offset ;contiguous with code segment 68A1 02 HDNDISKS DBHSTUATX DB 0 ; UNIT CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 199 68BC 0000 HSTCLTX DW 0 ; C 68BE 00 HSTHDTX DB 0  'FDC H/W ERROR',CR,LF 57204552524F 520D0A 68FA 535441545553 DB 'STATUS 0 = ' 2030203D20 6905 30304820 ST0 DB '00H ' 6909 535441545553 DB 'STATUS 1 = ' 2031203D20 6 2 ; NUMBER OF DISKS (UP TO 16) ;---------------------------- R1.132 '83 02/26 --------------------- 68A2 03 FDC_SPECIFY DB 03 ; 68A3 03 DB 03H  ; H 68BF 00 HSTSCTX DB 0 ; SECTOR ; ; 68C0 02 DVCCMD DB 02H ; TRANSFER LENGTH 68C1 04 DB 04H ; SENCE DEVICE STATUS 914 30304820 ST1 DB '00H ' 6918 535441545553 DB 'STATUS 2 = ' CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 200 2032203D20 6923 3030482 ; SPECIFY CMD 68A4 CB DB 0CBH ; SRT (4MSEC) , HUT (176MSEC) 68A5 30 DB 30H ; HLT (50MSEC) ;----------------------------- 68C2 00 DVC_US DB 00H ; HD,US ; ; 68C3 02 HOMER DB 02H ; LENGTH 68C4 07 DB 07H ; RECALIBRATE CMD 68C5 00 00D0A ST2 DB '00H ',CR,LF,LF 0A 692A 547970652052 DB 'Type R(Retry) , I(Ignore) , Any Key(Cancel)',CR,LF,0 285265747279 29202C204928 49676E6F7265 29202C20416E 79204B657928 4-------------------------------------- ; I/O CONTROLL BLOCK 68A6 09 IOCB DB 09H ; TRANSFER LENGTH 68A7 06 DB 06H ; READ CMD MT=0, MF=FM, SK=0  HOMERU DB 0H ; UNIT = 0 ; ; 68C6 03 SEEKCMD DB 03H ; LENGTH 68C7 0F DB 0FH ; SEEK CMD 68C8 00 SEEKU DB 0H 3616E63656C 290D0A00 6958 00 STATUS0 DB 0 6959 00 STATUS1 DB 0 695A 000000000000 STATUS2 DB 0,0,0,0,0,0 6960 0D0A NORDYMSG DB CR,LF 6962 2A2A2A20466C D ; SINGLE DENCITY, SINGLE SIDE ; FD & STOP AT DDM 68A8 00 DISK DB 00H ; UNIT 68A9 00 TRK DB 00H ; C 68AA 00  ; UNIT 68C9 00 SEEKC DB 0H ; CYLINDER # ; 68CA 01 SENSCMD DB 01H ; LENGTH 68CB 08 DB 08H ; SENSE INTERRUPT STATE B '*** Floppy Disk Drive ' 6F7070792044 69736B204472 69766520 6978 303A FDNO DB '0:' 697A 206973204E6F DB ' is Not Ready ***',CR,LF 742052656164 79202A2A2A0D 0A 698 DB 00H ; H 68AB 00 SECT DB 00H ; R 68AC 00 DB 00H ; N 68AD 1A DB 1AH ; EOT 68AE 07 DB 07H ; GPL 68AF 80 ; ; ; 68CC 07 MSG DB 07H ; CMD LENGTH 68CD 49 DB 4249H ; CSRW CMD 68CE 01 DB 4001H ; EAD LOW 68CF 00 , D 547970652052 DB 'Type R(Retry) , Any Key(Cancel)',CR,LF,0 285265747279 29202C20416E 79204B657928 43616E63656C 290D0A00 69AF 0D0A LSTRTYMSG DB CR,LF 69B1 2A2A2A205468  0000 SEKPMAP DW 0 ; HD ERROR MAP PIOTER 6ACA 00 SEKHDUS DB 0 ;SEK HD,US 6ACB 00 SEKCLND DB 0 ;OLD CYLINDER 6ACC 0000 SEKCLNDH DW 0 ; HD OLD CYLINDER  EJECT ;--------------------------------------------- 6AE2 0D0A0D0A signon db cr,lf,cr,lf 6AE6 4E4543204164 DB 'NEC Advanced Personal Computer CP/M-86',CR,LF DB '*** The List Device is Not Ready ***',CR,LF 65204C697374 204465766963 65206973204E 6F7420526561 6479202A2A2A 0D0A 69D7 547970652052 DB 'Type R(Retry) , Any Key(Cancel)',CR,LF,0  6ACE 00 SEKHED DB 0 ;OLD HED 6ACF 00 FSTACSS DB 0 ; SELECT DISK FIRST ACCESS FLAG 6AD0 00 SVDSK DB 0 ; SAVE DISK NO 6AD1 00 DRVNM DB 0 ; BDO,LF 76616E636564 20506572736F 6E616C20436F 6D7075746572 2043502F4D2D 38360D0A0A 6B0F 202020566572 DB ' Version 1.1',CR,LF,LF 73696F6E2031 2E310D0A0A 6B20 436F70797269  285265747279 29202C20416E 79204B657928 43616E63656C 290D0A00 69F9 0D0A WRTPROMSG DB CR,LF 69FB 2A2A2A20466C DB '*** Floppy Disk Drive ' 6F7070792044 69736B204472 S GIVEN BY SAVE CX 6AD2 00 NDRIVE DB 0 ; NUMBER OF DRIVES / UNIT 6AD3 00 initcnt db 0 ; initialize count 6AD4 00 HDINITF DB 0 ; HARD DISK READ ERROR COUNT 6AD5 0000  DB 'Copyright (C) , Digital Research , Inc. ',CR,LF 676874202843 29202C204469 676974616C20 526573656172 6368202C2049 6E632E200D0A 6B4A 0D0A00 db cr,lf,0 ; 69766520 6A11 303A WPFDNO DB '0:' 6A13 206973205772 DB ' is Write Protected ***' 697465205072 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1  HDSOT DW 0 ; START CYLINDER NO. OF DRIVE ; 6AD7 ADDSET RW 4 ; SYSUNITID HARD DISK POINTER SET ; 007F TC1D EQU 7FH ; 1D DM--------------------------------------------- 6B4D 0D0A int_trp db cr,lf 6B4F 496E74657272 db 'Interrupt Trap Halt' 757074205472 61702048616C 74 6B62 0D0A db cr,lf  PAGE 201 6F7465637465 64202A2A2A 6A2A 0D0A00 DB CR,LF,0 6A2D 2A2A2A204861 UNEMSG DB '*** Hard disk unit [' 726420646973 6B20756E6974 205B 6A41 202C202C202C UNEMSG1 DB A TERMIMAL COUNTER 00FF TC2D EQU 0FFH ; 2D DMA TERMINAL COUNTER CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 202 1FFF tchd equ  6B64 00 DB 0 ; ; BIOS READ/WRITE BUFFER 6B65 L EQU OFFSET $ 6B66 L1 EQU (L AND 0FFFEH)+2  ' , , , ' 20 6A48 5D2063796C69 UNEMSG2 DB '] cylinder read error ***',CR,LF,0 6E6465722072 656164206572 726F72202A2A 2A0D0A00 6A64 0D0A NOTDEFMSG DB CR,LF 6A66 204861726420  1fffh ; hard disk terminal counter 0019 DMA_WRT EQU 19H ; DMA (MEMORY TO I/O) 0015 DMA_RAD EQU 15H ; DMA (I/O TO MEMORY) 0011 DMA_VRY EQU 11H ; DMA (VERIFY) 0005  ORG L1 6B66 R_W_BUFF RB 128 6BE6 R_W_BUFF2D RB 256 ;-------------------- r1.133 '83 03/25 ------------------- 6CE6 PRE_BUFF2D RB 256 ; DMA BUFFER FOR A DB ' Hard disk unit is not defined at the configuration ',CR,LF 6469736B2075 6E6974206973 206E6F742064 6566696E6564 206174207468 6520636F6E66 696775726174 696F6E200D0A 6A9C 20506C65617 fdc_wrt1d equ 05h ;fdc write command (1d) 0006 fdc_rad1d equ 06h ;fdc read command (1d) 00C5 fdc_wrt2d equ 0c5h ;fdc write command (2d) 00C6 FTER READ 6DE6 00 WRTVCTR DB 0 ; WRITE VECTOR 0002 VCTRCNT EQU 2 ; VECTOR COUNTER 0003 VCTRMSK EQU 03H ; WRITE VECTOR MASK ;---------------------3 DB ' Please reboot from floppydisk .',CR,LF,0 65207265626F 6F742066726F 6D20666C6F70 70796469736B 202E0D0A00 6ABF 0000 DMA_ADR DW 0 ;DMA OFFSET FROM DS 6AC1 0000  fdc_rad2d equ 0c6h ;fdc read command (2d) 00B0 hdc_red equ 0b0h ; hard disk read cmd 00F0 hdc_wrt equ 0f0h ; hard disk write cmd ; BUFFER TO DMA------------------------------------ ; System Memory Segment Table 6DE7 01 segtable db 1 ;1 segment 6DE8 0008 dw tpa_seg ;1st seg starts after BIOS 6DEA 0018  dma_seg dw 0 ;DMA Base Segment 6AC3 0000 DMA_TC DW 00H ;DMA TERMINAL COUNTER 6AC5 00 DMA_CH1 DB 0 ;CH1 REG FILE 6AC6 0000 DMA_SND DW 0 ;ACTUAL ADDRESS TO DMA 6AC8 CONTROLLER 6ADF 0000 DMA_BUFF DW 0 ; 6AE1 00 DMA_RW DB 0 ;DMA READ/WRITE MODE SET CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 203-  dw tpa_len ;and extends to 20000 ;---------------------------------------------------------- = include singles.lib ;read in disk definitions = ; DISKS  ; 6: Sector Skew Factor = ; = 6E2C dpb0 equ offset $ ;Disk Parameter Block =6E2C 1A00 dw 26 ;Sectors Per Track =6E2E 03 db location Vector Size = 0010 css2 equ css0 ;Same Checksum Vector Size = 6E3B xlt2 equ xlt0 ;Same Translate Table = ; = ; Disk 3 is th4 = 6DEC dpbase equ $ ;Base of Disk Parameter Blocks =6DEC 3B6E0000 dpe0 dw xlt0,0000h ;Translate Table CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1  3 ;Block Shift =6E2F 07 db 7 ;Block Mask =6E30 00 db 0 ;Extnt Mask =6E31 F200 dw 242 ;Disk Size - 1 =6E33 3F00 e same as Disk 0 = ; = 6E2C dpb3 equ dpb0 ;Equivalent Parameters = 001F als3 equ als0 ;Same Allocation Vector Size = 0010 css3 equ css0  PAGE 204 =6DF0 00000000 dw 0000h,0000h ;Scratch Area =6DF4 556E2C6E dw dirbuf,dpb0 ;Dir Buff, Parm Block =6DF8 F46ED56E dw csv0,alv0 ;Check, Alloc Vec dw 63 ;Directory Max =6E35 C0 db 192 ;Alloc0 =6E36 00 db 0 ;Alloc1 =6E37 1000 dw 16 ;Check Size ;Same Checksum Vector Size = 6E3B xlt3 equ xlt0 ;Same Translate Table = ; ENDEF = ; = ; Uninitialized Scratch Memory Foltors =6DFC 3B6E0000 dpe1 dw xlt1,0000h ;Translate Table =6E00 00000000 dw 0000h,0000h ;Scratch Area =6E04 556E2C6E dw dirbuf,dpb1 ;Dir Buff, Parm Block =6E08 236F046F  =6E39 0200 dw 2 ;Offset = 6E3B xlt0 equ offset $ ;Translate Table =6E3B 01070D13 db 1,7,13,19 =6E3F 19050B11 db 25,5,11,17 =6E43 170309lows: = ; = 6E55 begdat equ offset $ ;Start of Scratch Area =6E55 dirbuf rs 128 ;Directory Buffer =6ED5 alv0 rs als0 ;Alloc Vect dw csv1,alv1 ;Check, Alloc Vectors =6E0C 3B6E0000 dpe2 dw xlt2,0000h ;Translate Table =6E10 00000000 dw 0000h,0000h ;Scratch Area =6E14 556E2C6E dw dirbuf,dpb2 ;D0F db 23,3,9,15 =6E47 1502080E db 21,2,8,14 =6E4B 141A060C db 20,26,6,12 =6E4F 1218040A db 18,24,4,10 =6E53 1016 db 16,22 = 001F or =6EF4 csv0 rs css0 ;Check Vector =6F04 alv1 rs als1 ;Alloc Vector =6F23 csv1 rs css1 ;Check Vector =6F33 alv2 rs ir Buff, Parm Block =6E18 526F336F dw csv2,alv2 ;Check, Alloc Vectors =6E1C 3B6E0000 dpe3 dw xlt3,0000h ;Translate Table =6E20 00000000 dw 0000h,0000h ;Scratch Area =6E24 556E2 als0 equ 31 ;Allocation Vector Size = 0010 css0 equ 16 ;Check Vector Size = ; DISKDEF 1,0 = ; = ; Di als2 ;Alloc Vector =6F52 csv2 rs css2 ;Check Vector =6F62 alv3 rs als3 ;Alloc Vector =6F81 csv3 rs css3 ;Check Vector = 6F91 C6E dw dirbuf,dpb3 ;Dir Buff, Parm Block =6E28 816F626F dw csv3,alv3 ;Check, Alloc Vectors = ; DISKDEF 0,1,26,6,1024,243,64,64,2 = ; = sk 1 is the same as Disk 0 = ; CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 205 = 6E2C dpb1 equ dpb0 ;Equivalent Parameter enddat equ offset $ ;End of Scratch Area = 013C datsiz equ offset $-begdat ;Size of Scratch Area =6F91 00 db 0 ;Marks End of Module =  ; 1944: 128 Byte Record Capacity = ; 243: Kilobyte Drive Capacity = ; 64: 32 Byte Directory Entries = ; 64: Checked Directory Entries = 001F als1 equ als0 ;Same Allocation Vector Size = 0010 css1 equ css0 ;Same Checksum Vector Size = 6E3B xlt1 equ xlt0 ;Same Translate Table =  include double.lib ;read in f2d disk definitions = ; DISKS 4 = 6F92 dpbase2 equ $ ;Base of Disk Parameter Blocks =6F92 00000000 dpe20 dw xlt20,0000h ;Tras = ; 128: Records / Extent = ; 8: Records / Block = ; 26: Sectors / Track = ; 2: Reserved Tracks =  ; = ; Disk 2 is the same as Disk 0 = ; = 6E2C dpb2 equ dpb0 ;Equivalent Parameters = 001F als2 equ als0 ;Same Al- nslate Table =6F96 00000000 dw 0000h,0000h ;Scratch Area =6F9A E16FD26F dw dirbuf2,dpb20 ;Dir Buff, Parm Block =6F9E 9F706170 dw csv20,alv20 ;Check, Alloc Vectors =6FA2 0000000 css20 equ 64 ;Check Vector Size = ; DISKDEF 1,0 = ; = ; disk 1 is the same as disk 0 = ; = 6FD2 dpb21 eqCheck Vector =71DB alv23 rs als23 ;Alloc Vector =7219 csv23 rs css23 ;Check Vector = 7259 enddat2 equ offset $ ;End of Scratch Area = 0278 0 dpe21 dw xlt21,0000h ;Translate Table =6FA6 00000000 dw 0000h,0000h ;Scratch Area =6FAA E16FD26F dw dirbuf2,dpb21 ;Dir Buff, Parm Block =6FAE 1D71DF70 dw csv21u dpb20 ;Equivalent Parameters = 003E als21 equ als20 ;Same Allocation Vector Size = 0040 css21 equ css20 ;Same Checksum Vector Size = 0000 xlt21 equ  datsiz2 equ offset $-begdat2 ;Size of Scratch Area =7259 00 db 0 ;Marks End of Module ;---------------------------------------------------------- 725A xl,alv21 ;Check, Alloc Vectors =6FB2 00000000 dpe22 dw xlt22,0000h ;Translate Table =6FB6 00000000 dw 0000h,0000h ;Scratch Area =6FBA E16FD26F dw dirbuf2,dpb22 ;Dir Buff, Parm Blockxlt20 ;Same Translate Table = ; = ; disk 2 is the same as disk 0 = ; = 6FD2 dpb22 equ dpb20 ;Equivalent Parameters = 003E tskew3 equ offset $ 725A 0104070A db 1,4,7,10 725E 0D101316 db 13,16,19,22 7262 19020508 db 25,2,5,8 7266 0B0E1114 db  =6FBE 9B715D71 dw csv22,alv22 ;Check, Alloc Vectors CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 206 =6FC2 00000000 dpe23 dw xlt23,0000h als22 equ als20 ;Same Allocation Vector Size = 0040 css22 equ css20 ;Same Checksum Vector Size = 0000 xlt22 equ xlt20 ;Same Translate Table = ; = 11,14,17,20 726A 171A0306 db 23,26,3,6 726E 090C0F12 db 9,12,15,18 7272 1518 db 21,24 = include hdparam.lib ; read in ha ;Translate Table =6FC6 00000000 dw 0000h,0000h ;Scratch Area =6FCA E16FD26F dw dirbuf2,dpb23 ;Dir Buff, Parm Block =6FCE 1972DB71 dw csv23,alv23 ;Check, Alloc Vectors =  ; disk 3 is the same as disk 0 = ; = 6FD2 dpb23 equ dpb20 ;Equivalent Parameters = 003E als23 equ als20 ;Same Allocation Vector Size = rd disk definions = ; 12/02/'82 = ; = 7274 HDDPBASE EQU $ ; BASE OF DISK PARAMETER BLOCKS =7274 00000000 HDDPE0 DW HDXLT0,0000H ; TRANSLATE ; DISKDEF 0,1,52,,2048,494,256,256,2 = 6FD2 dpb20 equ offset $ ;Disk Parameter Block =6FD2 3400 dw 52 ;Sectors Per Track =6FD4 04  0040 css23 equ css20 ;Same Checksum Vector Size = 0000 xlt23 equ xlt20 ;Same Translate Table = ; ENDEF = ; =  TABLE =7278 00000000 DW 0000H,0000H ; SCRATCH AREA =727C 556EB472 DW DIRBUF,HDDPB0 ; DIRECTORY BUFFER, PARA BLOCK =7280 0000F072 DW 0000H,HDALV0 ; CHECK, db 4 ;Block Shift =6FD5 0F db 15 ;Block Mask =6FD6 00 db 0 ;Extnt Mask =6FD7 ED01 dw 493 ;Disk Size - 1 =6FD9 ; Uninitialized Scratch Memory Follows: = ; = 6FE1 begdat2 equ offset $ ;Start of Scratch Area =6FE1 dirbuf2 rs 128 ;Directory Buffer =7061  ALLOC VECTORS =7284 00000000 HDDPE1 DW HDXLT1,0000H ; TRANSLATE TABLE =7288 00000000 DW 0000H,0000H ; SCRATCH AREA =728C 556EC372 DW DIRBUF,HDDPB1 ; DIRECTORY B FF00 dw 255 ;Directory Max =6FDB F0 db 240 ;Alloc0 =6FDC 00 db 0 ;Alloc1 =6FDD 4000 dw 64 ;Chalv20 rs als20 ;Alloc Vector =709F csv20 rs css20 ;Check Vector =70DF alv21 rs als21 ;Alloc Vector =711D csv21 rs css21 ;Check VectUFF,PARA BLOCK =7290 00003773 DW 0000H,HDALV1 ; CHECK, ALLOC VECTORS =7294 00000000 HDDPE2 DW HDXLT2,0000H ; TRANSLATE TABLE =7298 00000000 DW 0000H,0000H ; SCReck Size =6FDF 0200 dw 2 ;Offset = 0000 xlt20 equ 0 ;No Translate Table = 003E als20 equ 62 ;Allocation Vector Size = 0040 or =715D alv22 rs als22 ;Alloc Vector CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 207 =719B csv22 rs css22 ;. ATCH AREA =729C 556ED272 DW DIRBUF,HDDPB2 ; DIRECTORY BUFF,PARA BLOCK =72A0 00007E73 DW 0000H,HDALV2 ; CHECK, ALLOC VECTORS =72A4 00000000 HDDPE3 DW HDXLT3,0000H EQU 71 ; ALLOCATION VECTOR SIZE = 0000 HDCSS0 EQU 0 ; CHECK VECTOR SIZE = ; = 72C3 HDDPB1 EQU OFFSET $ =72C3 4000 DW  ; SAME CHECKSUM VECTOR SIZE = 0000 HDXLT2 EQU HDXLT0 ; SAME TRANSLATE TABLE = ; = 72E1 HDDPB3 EQU OFFSET $ =72E1 4000 DW 64 ; TRANSLATE TABLE =72A8 00000000 DW 0000H,0000H ; SCRATCH AREA =72AC 556EE172 DW DIRBUF,HDDPB3 ; DIRECTORY BUFF,PARA BLOCK =72B0 0000C573 DW 0000H,HDALV3  64 ; SECTORS PER TRACK =72C5 06 DB 6 ; BLOCK SIFT =72C6 3F DB 63 ; BLOCK MASK =72C7 03 DB 3  ; SECTORS PER TRACK =72E3 06 DB 6 ; BLOCK SIFT =72E4 3F DB 63 ; BLOCK MASK =72E5 03 DB 3 ; EXTNT; CHECK, ALLOC VECTORS = ; DISKDEF = ; = ; : 128 BYTE RECORD CAPACITY = ; : KILOBYTE DRIVE CAPACITY = ; EXTNT MASK =72C8 3102 DW 561 ; DISK SIZE =72CA FF01 DW 511 ; DIRECTORY MAX =72CC C0 DB 192 ; ALLOC MASK =72E6 3102 DW 561 ; DISK SIZE =72E8 FF01 DW 511 ; DIRECTORY MAX =72EA C0 DB 192 ; ALLOC0 =72EB 00  ; 512 : 32 BYTE DIRECTORY = ; : CHECKED DIRECTORY ENTRIES = ; : RECORDS / EXTENT = ; : R0 =72CD 00 DB 0 ; ALLOC1 =72CE 0000 DW 0 ; CHECK SIZE =72D0 0D00 DW 13 ; OFFSET '83/01/26 - = 0047  DB 0 ; ALLOC1 =72EC 0000 DW 0 ; CHECK SIZE =72EE 0D00 DW 13 ; OFFSET '83/01/26 - CP/M ASM86 1.1 SOURCE: USCBIOS.A8ECORDS / BLOCK = ; : SECTORS / TRACK = ; 0 : RESERVED TRACKS = ; 1 : SECTOR SKEW FACTOR = ; = 0000  HDALS1 EQU HDALS0 ; SAME ALLOCATION VECTOR SIZE = 0000 HDCSS1 EQU HDCSS0 ; SAME CHECKSUM VECTOR SIZE = 0000 HDXLT1 EQU HDXLT0 ; SAME TRANSLATE TA6 Customized Basic I/O System V1 PAGE 209 = 0047 HDALS3 EQU HDALS0 ; SAME ALLOCATION VECTOR SIZE = 0000 HDCSS3 EQU HDCSS0 ; SAME C HDXLT0 EQU 0 = 72B4 HDDPB0 EQU OFFSET $ =72B4 4000 DW 64 ; SECTORS PER TRACK =72B6 06 DB 6 ; BLOCK SIFT CP/M ASM86 1.1BLE = ; = 72D2 HDDPB2 EQU OFFSET $ =72D2 4000 DW 64 ; SECTORS PER TRACK =72D4 06 DB 6 ; BLOCK SIFT =72D5 3F HECKSUM VECTOR SIZE = 0000 HDXLT3 EQU HDXLT0 ; SAME TRANSLATE TABLE = ; = 72F0 HDBEGDAT EQU OFFSET $ ; START OF SCRATCH AREA =72F0 HDALV0  SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 208 =72B7 3F DB 63 ; BLOCK MASK =72B8 03 DB 3 ; EXT DB 63 ; BLOCK MASK =72D6 03 DB 3 ; EXTNT MASK =72D7 3102 DW 561 ; DISK SIZE =72D9 FF01 DW RS HDALS0 ; ALLOC VECTOR =7337 HDCSV0 RS HDCSS0 ; CHECK VECTOR =7337 HDALV1 RS HDALS1 ; ALLOC VECTOR =737E HDCSV1 RS NT MASK =72B9 3102 DW 561 ; DISK SIZE =72BB FF01 DW 511 ; DIRECTORY MAX =72BD C0 DB 192 ; ALLOC0 =72BE 00  511 ; DIRECTORY MAX =72DB C0 DB 192 ; ALLOC0 =72DC 00 DB 0 ; ALLOC1 =72DD 0000 DW 0  HDCSS1 ; CHECK VECTOR =737E HDALV2 RS HDALS2 ; ALLOC VECTOR =73C5 HDCSV2 RS HDCSS2 ; CHECK VECTOR =73C5 HDALV3 RS HDALS3  DB 0 ; ALLOC1 =72BF 0000 DW 0 ; CHECK SIZE =72C1 0D00 DW 13 ; OFFSET '83/01/26 - = 0047 HDALS0  ; CHECK SIZE =72DF 0D00 DW 13 ; OFFSET '83/01/26 - = 0047 HDALS2 EQU HDALS0 ; SAME ALLOCATION VECTOR SIZE = 0000 HDCSS2 EQU HDCSS0 .  ; ALLOC VECTOR =740C HDCSV3 RS HDCSS3 ; CHECK VECTOR = 740C HDENDDAT EQU OFFSET $ ; END OF SCRATCH AREA = 011C HDDATSIZ EQU OFFSET $-HDBEGDAT ; SIZE ;* values of hstsiz up to 2048. * ;* * ;* hstsiz hstblk secshf * ; ; ;***************************************************** CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 211 ;*  OF SCRATCH AREA =740C 00 DB 0 ; MASK END OF MODULE = ; = ;************* HARD DISK ERROR MAP **************** = ; = 740D * 256 2 1 * ;* 512 4 2 * ;* 1024 8 3 * ;* 20 * ;* Uninitialized RAM areas follow, including the * ;* areas created by the GENDEF utility listed above. * ;*  HDERRMAP EQU OFFSET $ =740D RW (HDFTS0+1)*2 ; DRIVE 0: ERROR MAP =7471 RW (HDFTS1+1)*2 ; DRIVE 1: ERROR MAP =74D5 RW 48 16 4 * ;* * ;***************************************************** 0001 secshf equ 1 ; * ;***************************************************** 759D 00 sek_dsk db 0 ;seek disk number 759E 0000 sek_trk dw 0 ;seek tr (HDFTS2+1)*2 ; DRIVE 2: ERROR MAP =7539 RW (HDFTS3+1)*2 ; DRIVE 3: ERROR MAP = ; = = = CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 log2(hstblk) 0034 fdspt equ hstblk * hstspt ;CP/M sectors/track 0001 secmsk equ hstblk-1 ;sector mask 0040 hdspt equ 64 ;hd CP/M secter/track 003F ack number 75A0 00 sek_sec db 0 ;seek secter number ; 75A1 00 sek_hst db 0 ;seek disk number 75A2 00 hst_act db 0 ;host act PAGE 210 eject ;***************************************************** ;* * ;* hdsmask equ 63 ;hd sekter mask ; ;***************************************************** ;* * ive flag 75A3 00 hst_wrt db 0 ;host written flag 75A4 00 hstacthd db 0 ; hard disk active flag 75A5 00 hstwrthd db 0 ; hard disk written flag 75A6 0 Secter blocking / Deblocking (Area) * ;* * ;***************************************************** ; 0000  ;* BDOS constants on entry to write * ;* * ;***************************************************** 0000 wral0 hst_sec db 0 ;host secter number ; 75A7 00 una_cnt db 0 ;unalloc rec cnt 75A8 00 una_dsk db 0 ;last unalloc disk 75A9 000 una equ byte ptr [BX] ;name for byte at BX ; 0010 fdblksiz equ 16 ;CP/M allocation size 0040 hdblksiz equ 64 ;hard disk allocation size l equ 0 ;write to allocated 0001 wrdir equ 1 ;write to directory 0002 wrual equ 2 ;write to un@llocated ; 0 una_trk dw 0 ;last unalloc track 75AB 00 una_sec db 0 ;last unalloc sector ; 75AC 00 erflag db 0 ;error reporting 75AD 00 0100 hstsiz equ 256 ;host disk sector size 001A hstspt equ 26 ;host disk sectors/trk 0002 hstblk equ hstsiz/128 ;CP/M sects/host buff ;***************************************************** ;* * ;* The BIOS entry points given below show the * ;* code whi rsflag db 0 ;read sector flag 75AE 00 readop db 0 ;1 if read operation 75AF 00 wrtype db 0 ;write operation type 75B0 00 homeflg d ; ;***************************************************** ;* * ;* secshf is log2(hstblk), and is listed below for * ch is relevant to deblocking only. * ;* * ;***************************************************** ; ; / b 0 ;cylinder 0,hed 0 flag 75B1 00 blksiz db 0 ;fd and hd blksiz 75B2 00 cpmspt db 0 ;fd and hd cpmspt 75B3 00 fid db 0 ;fd INTKB_SEGMENT RW 1 ORG 4*220 0370 EXT_FNC_INT_OFFSET RW 1 0372 EXT_FNC_INT_SEGMENT RW 1 end END OF ASSEMBLY. **************** ; January 26,1983 ; Finished basic driver ; ; February 10,1983 ; d check flag/0:f1d 1:f2d 75B4 00 fd0fid db 0 ; fd unit a: fid 75B5 00 fd1fid db 0 ; fd unit b: fid 75B6 00 fd2fid db 0 ; fd unit c: fid 75B7 00 NUMBER OF ERRORS: 0. USE FACTOR: 55%  1 ORG 8CH 008C INTTM_OFFSE Fixed circle line style ; Fixed fill bar size ; ; March 28,1983 ; Fixed zero length graphics text  fd3fid db 0 ; fd unit d: fid 75B8 0000 fidsav dw 0 ; addr save of fdd unit fid area 75BA 00 hdunitid db 0 ; hard disk unit a: or b: fid area 75BB  ; Fixed line length and color for cell array ; Added fill styles ; Added fast locator ; Added input choice  loc_stk rw 32 ; local stack for initialization 75FB stkbase equ offset $ 75FB lastoff equ offset $ 0800 tpa_seg equ 0800h ; old = (lastoff+0400h+15) / 16  ; Added input valuator ; Added sample mode input ; ; April 5,1983 ; Fixed 1800 tpa_len equ 2000h - tpa_seg 75FB 00 db 0 ;fill last address for GENCMD ;********************************************* ;*  round down on graphic text size ; ;LINK86 DDNEC,DDNECLIB,NECASCII ; DGROUP GROUP DATA DDRIVER CSEG  * ;* Dummy Data Section * ;* * ;********************************************* 0000  ; ; EXTRN GRRESET:NEAR,GRSLV:NEAR,GRSYNC:NEAR,GRPITCH:NEAR EXTRN GRZOOM:NEAR,GRSTART:NEAR,GRCSRO:NEAR EXTRN G dseg 0 ;absolute low memory org 0 ;(interrupt vectors) 0000 int0_offset rw 1 0002 int0_segment rw 1 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 RCSRFORM:NEAR,GRSCROLL:NEAR,GRCLEAR:NEAR EXTRN GRTEXTW:NEAR,GRWRITE:NEAR,GRVECTW:NEAR EXTRN GRVECTE:NEAR,GRMASK:NEAR EXTRN GRTEXTE:NEAR,GRGDCC1:NCustomized Basic I/O System V1 PAGE 212 ; pad to system call vector 0004 rw 2*(bdos_int-1) 0380 bdos_offset rw 1 03 CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 PAGE 1 ;************************************************************************ ;* EAR,GRGDCC:NEAR EXTRN GRCSRO:NEAR EXTRN DDINIT:NEAR EXTRN GRFXON:NEAR,GRFXOFF:NEAR ; 00E0 BDOS 82 bdos_segment rw 1 ORG 8CH 008C INTTM_OFFSET RW 1 008E INTTM_SEGMENT RW 1 0090 INTKB_OFFSET RW 1 0092  DEVICE DRIVER * ;* FOR NEC APC WITH NEC 7220 * ;********************************************************/  EQU 0E0H ; PUBLIC DdNecApc ; 0072 GRCMD EQU 072H 0020 GRWRTW EQU 020H ; _4 EQU word ptr 6 0008 W_5 EQU word ptr 8 000A W_6 EQU word ptr 10 000C W_7 EQU word ptr 12 000E W_8  ParamPushLoop: 001D AD LODSW ;Get a parameter pointer word 001E 50 Push Ax ; Push onto my stack 001F E2FC 001D Loop ParamPushLoo ; ;The following equates are for BP addressing the arguments ;passed into the GIOS device driver ; 0000 OLD_BP EQU  EQU word ptr 14 0010 W_9 EQU word ptr 16 0012 W_10 EQU word ptr 18 CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 p ; Loop until all 5 Dword Ptrs pushed 0021 55 Push Bp ; Point Bp at Contrl offset, preserving 0022 8BEC Mov Bp,Sp ; the caller's for politeness  0 CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 PAGE 2 0002 CONTRL_O EQU 2 ;offset control array 0004 CON PAGE 3 Eject ; Upon entry to the driver from GSX, Ds:Dx points to the parameter block. ; All other registers are undefined.  ; Point Ds to our data segment 0024 B80000 R Mov Ax,Seg Function_Table ; Segment base of our data 0027 8ED8 Mov Ds,Ax ; No further need for caller's DsTRL_S EQU 4 ;segment control array 0002 CONTRL EQU dword ptr CONTRL_O 0006 INTIN_O EQU 6 ;offset integer in array 0008  ; The driver should use its own stack, to avoid overflowing the Gdos caller's. DdNecApc: 0000 8BC4 Mov Ax,Sp ; Save caller's stack 0002 8CD3 Mov  ;The following routine does a computed call based on the function op code ;passed in CONTRL(1) 0029 FC Cld ;make the direction flag 'normal'  INTIN_S EQU 8 ;integer in array 0006 INTIN EQU dword ptr INTIN_O 000A PTSIN_O EQU 10 ;offset points in array 000C Bx,Ss 0004 9C Pushf 0005 5E Pop SI 0006 FA Cli ; watch out for old chips 0007 B90000 R Mov Cx,Seg DriverStack ; 002A C47E02 Les DI,CONTRL[BP] ;ES:DI -> control array 002D 26C745040000 Mov ES:W_3[DI],0 ;clear contrl(3) CP/M RASM86 0.2 SOURCE: DDNECAPC.A86  PTSIN_S EQU 12 ;segment points in array 000A PTSIN EQU dword ptr PTSIN_O 000E INTOUT_O EQU 14 ;offset of integer out ar Point stack at our area 000A 8ED1 Mov Ss,Cx 000C BC0002 R Mov Sp,Offset DriverStackTop 000F 56 Push SI 0010 9D Popf  PAGE 4 0033 268B1D Mov BX,ES:[DI] ;get the function number into BX 0036 83FB22 Cmp BX,MAX_FUNCTION ;asking for nonexistant function 0039 7706 ray 0010 INTOUT_S EQU 16 ;segment of integer out array 000E INTOUT EQU dword ptr INTOUT_O 0012 PTSOUT_O EQU 18 ;o ; Now in driver's stack 0011 53 Push Bx ; Preserve caller' stack base 0012 50 Push Ax ; and offset 0013 1E Push DS  0041 Ja NO_FUNCTION 003B D1E3 Shl BX,1 ;make it a word pointer 003D FF970000 R Call FUNCTION_TABLE[BX] ;call the proper routine NO_FUffset pts out array 0014 PTSOUT_S EQU 20 ;segment pts out array 0012 PTSOUT EQU dword ptr PTSOUT_O ; ;The followi ; and his DS ; Put the parameter block on the stack for Bp addressing. 0014 8BF2 Mov Si,Dx ; Point Ds:Si at parameter block 0016 83C612 Add NCTION: 0041 5D Pop BP ;restore the old BP 0042 83C414 Add Sp,20 ; Remove parameter block from stack 0045 1F Pop DS ng equates are for integer array indexing 0000 W_1 EQU word ptr 0 0002 W_2 EQU word ptr 2 0004 W_3 EQU word ptr 4 0006 W Si,18 ; Point at last word 0019 B90A00 Mov Cx,10 ; 10 words of pointers 001C FD Std ; Work down in address 0  ; recover the DS 0046 58 Pop Ax ; Ax <- caller's Sp 0047 5B Pop Bx ; Bx <- caller's Ss 0048 9C Pushf  ; 0074 1E Push DS ;save our data segment 0075 8CD8 Mov AX,DS ;get our data segment 0077 8EC0 Mov ES,AX INIT 00BC B01A Mov AL,01AH ;clear the alpha screen 00BE E8280D 0DE9 Call PUT_CHAR 00C1 B01E Mov AL,01EH 00C3 E8230D 0DE9 Call PUT_CHAR 00C ; watch out for old chips 0049 5E Pop SI 004A FA Cli 004B 8ED3 Mov Ss,Bx ; Return to caller's stack 004D 8BE0  ;into the extra segment 0079 BFD600 R Mov DI,offset WORKSTATION_ID ;point at the variables 007C C57606 Lds SI,INTIN[BP] ;point at the default values 007F B90A00 6 C3 Ret ; ;The following routine updates any pending graphics F_UPDATE_WORKSTATION: 00C7 C3 Ret  Mov Sp,Ax ; Pair not interruptable on 8086/88 004F 56 Push SI 0050 9D Popf 0051 CB Retf ; Return to driver caller CP/M Mov CX,10 ;words to move 0082 F3A5 Rep MOVSW 0084 B001 Mov AL,1 0086 B90500 Mov CX,5 0089 BF3101 R Mov DI,off ; ;The following routine is the escape code processor ;ENTRY: ; SS:BP -> stacked long word pointers ; ES:DI -> CONTROL(1) escape op-c RASM86 0.2 SOURCE: DDNECAPC.A86 PAGE 5 Eject ;The following routine sets up all of the default information for a set INPUT_MODE 008C F3AA Rep STOSB ;initilize all input modes to request 008E 1F Pop DS ;recover our DS 008F B91C00 Mov CX,28 ode ; ;EXIT: ; from selected routine ; F_ESCAPE: 00C8 268B5D0A Mov BX,ES:W_6[DI] driver ;and returns all of the device characteristics ;ENTRY: ; SS:BP -> stacked long pointers ; ES:DI -> CONTRL(1)  ;get the number of words to move 0092 BE4601 R Mov SI,offset DEFAULT_COLOR_DATA 0095 BF7E01 R Mov DI,offset COLOR_REQUEST_ARRAY 0098 F3A5 Rep MOVSW  ;get the opcode 00CC 83FB13 Cmp BX,LAST_ESCAPE_CODE ;too big ? 00CF 7601 00D2 Jbe DO_ESCAPE ;no then leap 00D1 C3 Ret ;else just re ; ;EXIT: ; CONTRL(3) = 6 ; CONTRL(5) = 45 ; INTOUT(1) - INTOUT(45) set up F_OPEN_WORKSTATION:  ;move them in 009A C606FD0020 R Mov NEC_MODE,MODE_REP ;set up the defaults 009F C606F90000 R Mov POLYMARKER_NEC_SIZE,0 00A4 C606FA0002 R Mov TEXT_NEC_DIRECTION,2 00A9 C606FB0000 R turn DO_ESCAPE: 00D2 D1E3 Shl BX,1 ;make it a word pointer 00D4 FFA74600 R Jmp ESCAPE_TABLE[BX] ;leap to it ; 0052 26C745040600 Mov ES:W_3[DI],6 ;set up CONTRL(3) 0058 26C745082D00 Mov ES:W_5[DI],45 ;set up CONTRL(5) 005E C47E0E Les DI,INTOUT[BP] ;point at the output  Mov TEXT_NEC_SIZE,0 00AE C7060F010000 R Mov INCREMENT_BIAS,0 ;make graphic cursor move slowly 00B4 E80000 E Call DDINIT ;wake up the 7220 00B7 C3  F_ESCAPE_0: 00D8 BE7E00 R Mov SI,offset ID_STRING 00DB AD Lodsw ;get the count 00DC 26894508 Mov ES:W_5[DI],AX ;set size 00E0 C4array 0061 BEEB02 R Mov SI,offset X_MAX ;point to top of structure 0064 B92D00 Mov CX,45 ;number of words to move 0067 F3A5 Rep MOVSW 0069 C47E12  Ret ; ;The following closes a workstation F_CLOSE_WORKSTATION: 00B8 C3 Ret ; CP/M RASM86 0.2 SOURCE: DDNECAPC.A87E0E Les DI,INTOUT[BP] 00E3 8BC8 Mov CX,AX 00E5 F3A5 Rep MOVSW ;copy the ID 00E7 C3 Ret ;  Les DI,PTSOUT[BP] ;point at the output array 006C BE4503 R Mov SI,offset OPEN_WORKSTATION_PTSOUT 006F B90C00 Mov CX,12 0072 F3A5 Rep MOVSW 6 PAGE 6 ;The following routine clears the graphics screen F_CLEAR_WORKSTATION: 00B9 E80000 E Call DD0  F_ESCAPE_1: ;inquire addressable character cels 00E8 C47E0E Les DI,INTOUT[BP] ;point at the output array 00EB 26C7051800 Mov ES:W_1[DI],24 ;24P 0118 EB33 014D Jmps ESCAPE_STRING_OUT ; F_ESCAPE_10: ;erase to end of line 011A BEAE00 R Mov SI,offset ANSI_ERASE_TO_Eword is count 014E 8BC8 Mov CX,AX ;get it into CX ESCAPE_STRING_OUT_LOOP: 0150 AD Lodsw ;get next character 0151 E8BDFF  rows 00F0 26C745025000 Mov ES:W_2[DI],80 ;80 columns 00F6 C3 Ret ; F_ESCAPE_2: 00F7 E80000 E Call GRFXON OL 011D EB2E 014D Jmps ESCAPE_STRING_OUT ; F_ESCAPE_11: ;direct cursor address 011F BECC00 R Mov SI,offset ADM3A_CURSOR_POSITIO 0111 Call ESCAPE_CHAR_OUT ;send it 0154 E2FA 0150 Loop ESCAPE_STRING_OUT_LOOP 0156 C3 Ret ; F_ESCAPE_15:  ;turn on the grafix screen 00FA C3 Ret ; F_ESCAPE_3: 00FB E80000 E Call GRFXOFF ;turn off the grafix 00FE C3 N ;point at the string 0122 C47E06 Les DI,INTIN[BP] ;point at input string 0125 268B05 Mov AX,ES:W_1[DI] ;get the row 0128 041F Add AL,01FH ;inquire current cursor address 0157 B104 Mov CL,4 ;magic NEC command 0159 BA5D03 R Mov DX,offset CUR_ADD_BUF ;point at buffer 015C CDDC Int 220  Ret CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 PAGE 7 ; F_ESCAPE_4: ;cursor up 00FF B00B  ;20HEX is row 0 012A A3D200 R Mov ADM3A_ROW,AX ;stash it 012D 268B4502 Mov AX,ES:W_2[DI] ;get the column 0131 041F Add AL,01FH ;20Hex is ;magic NEC interrupt 015E C47E0E Les DI,INTOUT[BP] 0161 B30A Mov BL,10 0163 A15F03 R Mov AX,CUR_ROW ;its in ASCII DECIMAL 0166 250F0F  Mov AL,0BH ;VT 0101 EB0E 0111 Jmps ESCAPE_CHAR_OUT ; F_ESCAPE_5: ;cursor down 0103 B00A  col 0 0133 A3D400 R Mov ADM3A_COL,AX ;stash it 0136 EB15 014D Jmps ESCAPE_STRING_OUT ;do it ; F_ESCAPE_12: ;output  And AX,0F0FH ;Mask out upper nibbles 0169 8ACC Mov CL,AH ;save the 1's 016B 32E4 Xor AH,AH 016D F6E3 Mul BL 016F 02C1  Mov AL,0AH ;LF 0105 EB0A 0111 Jmps ESCAPE_CHAR_OUT ; F_ESCAPE_6: ;cursor forward 0107 B00C Mov AL,0Ccursor addressable text 0138 268B4D06 Mov CX,ES:W_4[DI] ;get the string count 013C 1E Push DS ;save our data segment 013D C57606 Lds SI,INTIN[B Add AL,CL 0171 268905 Mov ES:W_1[DI],AX 0174 A16203 R Mov AX,CUR_COL 0177 250F0F And AX,0F0FH 017A 8ACC Mov CL,AH 017C 32EH ;FF 0109 EB06 0111 Jmps ESCAPE_CHAR_OUT ; F_ESCAPE_7: 010B B008 Mov AL,08H ;cursor backward 010D EB02 P] ;point at the string 0140 E80D00 0150 Call ESCAPE_STRING_OUT_LOOP 0143 1F Pop DS 0144 C3 Ret ; F_ESCAPE_13: 4 Xor AH,AH 017E F6E3 Mul BL 0180 02C1 Add AL,CL 0182 26894502 Mov ES:W_2[DI],AX 0186 C3 Ret 0111 Jmps ESCAPE_CHAR_OUT ; F_ESCAPE_8: 010F B01E Mov AL,01EH ;cursor home ESCAPE_CHAR_OUT: 0111 E8D50C  0145 BEB800 R Mov SI,offset ANSI_REVERSE_ON CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 PAGE 8 0148 EB03 014D Jmps ESCAPE_STRING_OUT  ; F_ESCAPE_16: ;inquire tablet status 0187 C47E0E Les DI,INTOUT[BP] 018A 26C7050000 Mov ES:W_1[DI],0 ;not available 018F C3 0DE9 Call PUT_CHAR 0114 C3 Ret ; F_ESCAPE_9: ;erase to end of page 0115 BEA400 R Mov SI,offset ANSI_ERASE_TO_EO ; F_ESCAPE_14: 014A BEC200 R Mov SI,offset ANSI_REVERSE_OFF ESCAPE_STRING_OUT: 014D AD Lodsw ;first 1  Ret ; F_ESCAPE_17: 0190 C3 Ret ; F_ESCAPE_18: ;place cursor 0191 C47E0A s TOGGLE_INPUT_CURSOR ; ; ;The following routine does the poly line function based on the endpoint data ;passed in PTSIN  ;get initial X 023A A30000 E Mov XAD,AX 023D 268B4502 Mov AX,ES:W_2[DI] ;get initial Y 0241 A30000 E Mov YAD,AX 0244 83C704 PLYLP: ADD DI,4  Les DI,PTSIN[BP] 0194 268B05 Mov AX,ES:W_1[DI] ;get X 0197 A30000 E Mov XAD,AX 019A A30701 R Mov LAST_CURSOR_X,AX 019D 268B4502 Mov  ;ENTRY: ; SS:BP -> stacked long word pointers ; ES:DI -> CONTRL(1) ; ; F_POLYLINE: 0200 8B1EDA00  ; POINT AT NEXT PAIR PLYLP_1: 0247 51 Push CX ;save the loop count 0248 268B0D MOV CX,ES:W_1[DI] ;next X 024B 8BC1  AX,ES:W_2[DI] ;get y 01A1 A30000 E Mov YAD,AX 01A4 A30901 R Mov LAST_CURSOR_Y,AX TOGGLE_INPUT_CURSOR: CP/M RASM86 0.2 SOURCE: DDNECAPC.A86  R Mov BX,POLYLINE_COLOR 0204 8A87AE01 R Mov AL,COLOR_MAP_TABLE[BX] ;look up the color 0208 A2FE00 R Mov NEC_COLOR,AL ;save the mapped color 020B 8B1ED800 R  MOV AX,CX 024D 2B0E0000 E SUB CX,XAD ; DELTA X 0251 A3F200 R MOV NXTX,AX 0254 740C 0262 JZ XZER 0256 7312 026A JNC XPOS  PAGE 9 01A7 FF36E000 R Push TEXT_FONT 01AB FF360000 E Push XAD 01AF FF360000 E Push YAD 01B3 FF36FD00 R Push word Mov BX,POLYLINE_TYPE ;get the type index 020F D1E3 Shl BX,1 ;make it a word pointer 0211 8B873601 R Mov AX,POLYLINE_TABLE[BX] ;look up the line type 0258 F7D9 NEG CX ; ABS(DEL X) 025A C606F60000 R MOV XSGN,0 ; WAS NEGATIVE 025F E90D00 026F JMP DELY 0262 C606F60002 R XZER: MOV XSGN,ptr NEC_MODE 01B7 C606FD0021 R Mov NEC_MODE,MODE_COM ;set mode to XOR 01BC C606FE0007 R Mov NEC_COLOR,7 ;select white for cursor 01C1 C706E0000100 R Mov TEXT_FONT,1  F_POLY_1: 0215 A30000 E Mov GRTEXTP_W,AX ;drop into the structure 0218 E80000 E Call GRTEXTW ;only needs the first 2 bytes 021B B8FFFF Mov AX,0FFFFH 2 0267 E90500 026F JMP DELY 026A C606F60001 R XPOS: MOV XSGN,1 026F 268B5502 DELY: MOV DX,ES:W_2[DI] ;next Y 0273 8BC2 MOV AX,DX 0275 2B160000 E ;select normal font 01C7 C606F80010 R Mov CURRENT_CHARACTER,010H ;select cursor character 01CC C606000002 E Mov GRZOOMP,2 ;select size 01D1 E80000 E Call GRZOOM 01D4 832E000 ;get a mask 021E A30000 E Mov GRMASK_W,AX ;drop the mask into the structure 0221 E80000 E Call GRMASK ;set up the mask values 0224 C606000020 E Mov SUB DX,YAD 0279 A3F400 R MOV NXTY,AX 027C 7417 0295 JZ YZER 027E 731D 029D JNC YPOS 0280 F7DA NEG DX ; GET ABS(DEL Y) 0282 00D E Sub XAD,13 01D9 832E00000D E Sub YAD,13 01DE E83002 0411 Call DISPLAY_CHARACTER 01E1 8F06FD00 R Pop word ptr NEC_MODE 01E5 8F060000 E Pop YAD  GRWRT,GRWRTW ;set base mode to write 0229 C47E02 Les DI,CONTRL[BP] 022C 268B4D02 Mov CX,ES:W_2[DI] ;get the number of vertices 0230 49 Dec CX C606F70000 R MOV YSGN,0 ; WAS NEGATIVE 0287 803EF60002 R CMP XSGN,2 028C 7520 02AE JNE DELDEL 028E C606F60001 R MOV XSGN,1 0293 EB19 02AE  01E9 8F060000 E Pop XAD 01ED 8F06E000 R Pop TEXT_FONT 01F1 C3 Ret ; F_ESCAPE_19: ;remove cursor  ;make it zero relative 0231 7501 0234 Jnz DO_POLYLINE CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 PAGE 10 0233 C3 Ret JMPS DELDEL 0295 A0F600 R YZER: MOV AL,XSGN 0298 A2F700 R MOV YSGN,AL 029B EB11 02AE JMPS DELDEL 029D C606F70001 R YPOS: MOV YSGN,1 02A2 803EF60002 R 01F2 A10701 R Mov AX,LAST_CURSOR_X 01F5 A30000 E Mov XAD,AX 01F8 A10901 R Mov AX,LAST_CURSOR_Y 01FB A30000 E Mov YAD,AX 01FE EBA7 01A7 Jmp ;if the bozo sent us only one vertex DO_POLYLINE: 0234 C47E0A Les DI,PTSIN[BP] ;ES:DI -> input vertices 0237 268B05 Mov AX,ES:W_1[DI] 1 CMP XSGN,2 02A7 7505 02AE JNE DELDEL 02A9 C606F60000 R MOV XSGN,0 02AE 3BCA DELDEL: CMP CX,DX ; ABS(DELX) - ABS(DEL Y) 02B0 7204 02B6 JC DELNEG Jz POLYLINE_DONE 0308 E939FF 0244 Jmp PLYLP POLYLINE_DONE: 030B C3 Ret ; ;The following rotuine does the poly markerT,1 ;set it to normal POLYMARKER_LOOP: CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 PAGE 12 0350 8A1E0000 E Mov BL,GRZOOMP  02B2 B000 MOV AL,0 02B4 EB04 02BA JMPS GETDIR 02B6 B002 DELNEG: MOV AL,2 02B8 87CA XCHG CX,DX ; DELX MUST BE GREATER THAN DELY 02BA 02 function ;ENTRY: ; SS:BP -> stacked long word pointers ; ES:DI -> CONTRL(1) F_POLYMARKER: 030C 268B4D02 Mov CX ;get the scale factor 0354 FEC3 Inc BL ;make it one relative 0356 32FF Xor BH,BH ;clear the top 0358 D1E3 Shl BX,1 06F600 R GETDIR: ADD AL,XSGN 02BE 02C0 ADD AL,AL 02C0 0206F700 R ADD AL,YSGN 02C4 BBEA00 R MOV BX,offset DIRTBL 02C7 D7 XLAT DIRTBL CP,ES:W_2[DI] ;get the number of markers 0310 E369 037B Jcxz POLYMARKER_DONE ;if bozo sent us no coordinates 0312 51 Push CX ;save the count 0313 C606FC0002 R  ;X 2 035A D1E3 Shl BX,1 ;X 4 035C 268B05 Mov AX,ES:W_1[DI] ;get the next X 035F 2BC3 Sub AX,BX ;bias charac/M RASM86 0.2 SOURCE: DDNECAPC.A86 PAGE 11 02C8 0C08 OR AL,8 ; SET UP LINE DRAW COMMAND 02CA A20000 E MOV  Mov NEC_DIRECTION,2 ;set the direction to normal 0318 B8FFFF Mov AX,0FFFFH ;get a mask of all ones 031B A30000 E Mov GRMASK_W,AX 031E E80000 E Callter into the center 0361 A30000 E Mov XAD,AX ;save the new XAD 0364 268B4502 Mov AX,ES:W_2[DI] ;get next Y 0368 2BC3 Sub AX,BX 036A A30000 E  GRVECTP1,AL 02CD 890E0000 E MOV GRVECTDC,CX ; DRAW PARM DC 02D1 81260000FF3F E AND GRVECTDC,3FFFH 02D7 03D2 ADD DX,DX ; 2 * ABS (DEL Y) 02D9 89160000  GRMASK ;set the mask values 0321 C606000020 E Mov GRWRT,GRWRTW ;set base mode to write 0326 8B1EDE00 R Mov BX,POLYMARKER_COLOR ;get the color index 032A 8A87AE01 R  Mov YAD,AX ;stash it 036D 83C704 Add DI,4 ;point DI at next pair 0370 51 Push CX 0371 06 Push ES 0372 57  E MOV GRVECTD1,DX 02DD 8BC2 MOV AX,DX 02DF 2BC1 SUB AX,CX ; 2 * ABS(DEL Y) - ABS(DEL X) 02E1 A30000 E MOV GRVECTD,AX 02E4 81260000FF3F Mov AL,COLOR_MAP_TABLE[BX] ;get the color 032E A2FE00 R Mov NEC_COLOR,AL ;set up the color for the 7220 0331 A1DC00 R Mov AX,POLYMARKER_TYPE ;get the type of marker 0334 0410  Push DI 0373 E89B00 0411 Call DISPLAY_CHARACTER 0376 5F Pop DI 0377 07 Pop ES 0378 59 Pop CX 0379 E2D5 0350  E AND GRVECTD,3FFFH 02EA 2BC1 SUB AX,CX ; 2* ABS(DELY) - 2 * ABS(DEL X) 02EC A30000 E MOV GRVECTD2,AX 02EF 81260000FF3F E AND GRVECTD2,3FFFH 02F5 Add AL,010H ;markers start at 10H 0336 A2F800 R Mov CURRENT_CHARACTER,AL ;drop it into the character 0339 A0F900 R Mov AL,POLYMARKER_NEC_SIZE ;get the size of t Loop POLYMARKER_LOOP POLYMARKER_DONE: 037B 8F06E000 R Pop TEXT_FONT ;recover the font 037F C3 Ret ; ;  E85D0A 0D55 CALL CVECTE ;COLOR VECTOR EXECUTE 02F8 A1F200 R MOV AX,NXTX 02FB A30000 E MOV XAD,AX 02FE A1F400 R MOV AX,NXTY 0301 A30000 Ehe marker 033C A20000 E Mov GRZOOMP,AL ;drop it into the structure 033F E80000 E Call GRZOOM ;set the size 0342 C47E0A Les DI,PTSIN[BP] ;po ;The following routine displays the text at INTIN(1) with a length in CONTRL(4) ;at the position in PTSIN(1),PTSIN(2) with the current text color,scale,directi ;  MOV YAD,AX 0304 59 Pop CX ;recover the loop counter 0305 49 Dec CX ;can,t use loop instruction, too far 0306 7403 030B int at the points in array 0345 59 Pop CX ;recover the counter 0346 FF36E000 R Push TEXT_FONT ;save the current font 034A C706E0000100 R Mov TEXT_FON2  ;ENTRY: ; SS:BP -> stacked long pointers ; ES:DI -> CONTRL(1) ;EXIT: ; F_TEXT: 0380 06  Add AX,offset BASELINE_TABLE 03C8 8BF0 Mov SI,AX ;point at word pair 03CA AD Lodsw ;get X bias 03CB F6EB Imul BL F6EB Imul BL 0407 01060000 E Add YAD,AX ;adjust the Y address 040B 59 Pop CX 040C 5F Pop DI 040D 07  Push ES 0381 57 Push DI 0382 A0FB00 R Mov AL,TEXT_NEC_SIZE ;get the size value 0385 A20000 E Mov GRZOOMP,AL ;set up the parameter ;scale the base line bias 03CD 01060000 E Add XAD,AX ;zap it 03D1 AD Lodsw 03D2 F6EB Imul BL 03D4 01060000 E Add YAD,AX  Pop ES 040E E2CB 03DB Loop DO_DISPLAY_STRING ;till done F_TEXT_DONE: 0410 C3 Ret CP/M RASM86 0.2 SOURCE: DDNECAPC.A86  0388 E80000 E Call GRZOOM ;set the zoom factor 038B 5F Pop DI 038C 07 Pop ES 038D C606000020 E Mov GRWRT,GRWRTW ;set the 03D8 C47E06 Les DI,INTIN[BP] ;ES:DI -> string data DO_DISPLAY_STRING: 03DB 268A05 Mov AL,ES:[DI] ;get the next character 03DE 47  PAGE 14 ; ; ;the following routine displays the character at CURRENT_CHARACTER ;in the color specified in  mode to write 0392 8B1EE200 R Mov BX,TEXT_COLOR ;get the color for the text 0396 8A87AE01 R Mov AL,COLOR_MAP_TABLE[BX] ;look it up 039A A2FE00 R Mov NEC_COLOR,AL 039D 268B Inc DI ;bump the pointer 03DF 47 Inc DI ;by a word value 03E0 06 Push ES 03E1 57 Push DI 03E2 51 NEC_COLOR, at the CURRENT XAD,YAD ; DISPLAY_CHARACTER: 0411 A0F800 R Mov AL,CURRENT_CHARACTER ;get the character 0414 32E4 Xor AH,AH 4D06 Mov CX,ES:W_4[DI] ;get the length into CX 03A1 E36D 0410 Jcxz F_TEXT_DONE ;if zero length then leap 03A3 C47E0A Les DI,PTSIN[BP] ;ES:DI -> points Push CX ;save the count and the index 03E3 A2F800 R Mov CURRENT_CHARACTER,AL ;save the character ; 03E6 E82800 0411 Call DISPLAY_CHARACTER  ;parinoia strikes deep 0416 BB0800 Mov BX,8 ;calculate the bias 0419 F6E3 Mul BL ;find the start of the character bits 041B 050000 E  in array 03A6 268B05 Mov AX,ES:W_1[DI] ;get X address 03A9 A30000 E Mov XAD,AX 03AC 268B4502 Mov AX,ES:W_2[DI] ;and Y address 03B0 A30000 E  ; SCALE_CURSOR: 03E9 8A1E0000 E Mov BL,GRZOOMP ;get our current zoom factor 03ED FEC3 Inc BL ;make it 1 relative 03EF A0Add AX,offset CHARACTER_BIT_TABLE 041E 8BF0 Mov SI,AX ;index into SI 0420 BF0000 E Mov DI,offset GRTEXTP1 ;point DI to output structure 0423 06 Push Mov YAD,AX CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 PAGE 13 03B3 8A1E0000 E Mov BL,GRZOOMP ;get the zoom factor 03B7 FEC3 FA00 R Mov AL,TEXT_NEC_DIRECTION ;get the 7220 direction code 03F2 32E4 Xor AH,AH 03F4 D0E0 Shl AL,1 03F6 D0E0 Shl AL,1 ;make ES ;save both the segments 0424 8CD8 Mov AX,DS ;get the data segment 0426 8EC0 Mov ES,AX ;into the extra segment 0428 B90400  Inc BL ;make it one relative 03B9 A0FA00 R Mov AL,TEXT_NEC_DIRECTION ;get the text direction code 03BC A2FC00 R Mov NEC_DIRECTION,AL ;drop into the 7220 directio it a dword offset 03F8 05CB01 R Add AX,offset INCREMENT_TABLE ;point at the proper pair 03FB 8BF0 Mov SI,AX ;put it in an index register 03FD AD Lodsw Mov CX,4 ;8 byte transfer but words go faster 042B F3A5 Rep Movsw ;do the move 042D 07 Pop ES ; 042E C70600000700 En 03BF 32E4 Xor AH,AH ;zero the high byte 03C1 D0E0 Shl AL,1 03C3 D0E0 Shl AL,1 ;make a dword pointer 03C5 05EB01 R  ;get the value 03FE F6EB Imul BL ;scale it 0400 01060000 E Add XAD,AX ;adjust the X address 0404 AD Lodsw 0405 2  Mov GRVECTP2,7 ;always a 7 for text word ptr 0434 B410 Mov AH,NEC_NORMAL_CHAR ;get bit for normal character 0436 833EE00001 R Cmp TEXT_FONT,1 ;is it normal se 048A 7506 0492 Jnz DO_DISPLAY_PATTERN 048C 3C20 Cmp AL,MODE_REP 048E 7520 04B0 Jnz DO_DISPLAY_PATTERN_DONE 0490 B022 Mov AL,MODE_RES  ; save number of vertices 04E0 A1E400 R Mov AX,FILL_INTERIOR ;get interior style 04E3 3D0000 Cmp AX,0 04E6 7503 04EB Jnz DO_FILL ;if solid then leap 04E8 t 043B 7E02 043F Jle SET_CHARACTER_FONT 043D B490 Mov AH,NEC_SLANT_CHAR ;else set 2 is slanted SET_CHARACTER_FONT: 043F A0FC00 R Mov AL,NEC_DIREC DO_DISPLAY_PATTERN: 0492 3C20 Cmp AL,MODE_REP 0494 7502 0498 Jnz DDP_SAVE_MODE 0496 B023 Mov AL,MODE_SET DDP_SAVE_MODE: 0498 A20000 E9F200 05DD Jmp FILL_OUTLINE DO_FILL: 04EB BB0000 Mov BX,0 ;index if solid 04EE 3D0100 Cmp AX,1 ;test for solid 04FTION ;get the 7220 dirction code 0442 0AC4 Or AL,AH ;mark as character write 0444 A20000 E Mov GRVECTP1,AL ;drop into the data structure 0447 C70600000800 E  E Mov GRATTRIB,AL ;save the write mode 049B B90000 Mov CX,0 ;command only 049E E80000 E Call GRWRITE ;set the writing mode 04A1 E80000 1 7404 04F7 Jz DO_FILL_1 ;yes then leap 04F3 8B1EE600 R Mov BX,FILL_STYLE DO_FILL_1: 04F7 B103 Mov CL,3 CP/M RASM86 0.2 SOURCE: DDNECAPC. Mov GRVECTP4,8 ; DISPLAY_PATTERN: 044D C606000000 E Mov GRCOLR,GPLANE ;set the plane 0452 A0FD00 R Mov AL,NEC_MODE 0455 E Call GRCSRO ;put the cursor in the proper page 04A4 E80000 E Call GRTEXTW ;set up the pattern registers 04A7 B90500 Mov CX,5 ;5 bA86 PAGE 16 04F9 D3E3 Shl BX,CL 04FB 81C30000 E Add BX,offset CHARACTER_BIT_TABLE 04FF 891E0B02 R Mov FIL F606FE0002 R Test NEC_COLOR,BIT_GREEN 045A 7506 0462 Jnz CHAR_GRN ;if color then leap 045C 3C20 Cmp AL,MODE_REP 045E 7505 0465 Jnz TRY_CHAR_BLU yte write 04AA E80000 E Call GRVECTW ;send out this stuff 04AD E80000 E Call GRTEXTE ;do a write DO_DISPLAY_PATTERN_DONE: 04B0 C3 L_MASK_BASE,BX ;save it for later 0503 C7061302E803 R mov minY,1000 ! mov maxY,0 ; impossible min's and max's C70611020000 R ; search for biggest and smallest X and Y 0460 B022 Mov AL,MODE_RES CHAR_GRN: 0462 E82D00 0492 Call DO_DISPLAY_PATTERN TRY_CHAR_BLU: 0465 C606000001 E Mov GRCOLR,BPLANE 046 Ret ; ;The following routine fills the area described by the input data in PTSIN ;ENTRY: ; SS:BP -> stacked long word pointers 's 050F C4760A les si,PTSIN[BP] ; reference PTSIN 0512 8B0E1D02 R mov cx,num ; total number of points linelp: 0516 83C602 A A0FD00 R Mov AL,NEC_MODE 046D F606FE0004 R Test NEC_COLOR,BIT_BLUE 0472 7506 047A Jnz CHAR_BLU 0474 3C20 Cmp AL,MODE_REP 0476 7505 047D Jn ; F_FILLED_AREA: 04B1 8B1EE800 R Mov BX,FILL_COLOR 04B5 8A87AE01 R Mov AL,COLOR_MAP_TABLE[BX] 04B9 A2FE00 R Mov NEC_COLOR,AL 04BC C60600 add si,2 ; skip X coord 0519 26AD3B061302 R lods es:word ptr [si] ! cmp ax,miny ; see if Y is smallest 051F 7D03 0524 jnl domaxy 0521 A31302 R z TRY_CHAR_RED 0478 B022 Mov AL,MODE_RES CHAR_BLU: 047A E81500 0492 Call DO_DISPLAY_PATTERN TRY_CHAR_RED: CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 0020 E Mov GRWRT,GRWRTW ;mode to write 04C1 C7060000FFFF E Mov GRMASK_W,0FFFFH 04C7 E80000 E Call GRMASK 04CA C7060000FFFF E Mov GRWRTP,0FFFFH 04D0 C47602 mov miny,ax domaxy: 0524 3B061102 R cmp ax,maxy 0528 7E03 052D jng minmax_iterate 052A A31102 R mov maxy,ax minmax_iterate: 052D E2E7  PAGE 15 047D C606000002 E Mov GRCOLR,RPLANE 0482 A0FD00 R Mov AL,NEC_MODE 0485 F606FE0001 R Test NEC_COLOR,BIT_RED  les si,contrl[bp] 04D3 268B4402 mov ax,es:word ptr 2[si] 04D7 A31D02 R mov num,ax 04DA 2D0100 sub ax,1 04DD A31F02 R mov numsav,ax 3  0516 loop linelp ; iterate til done 052F A11302A32102 R mov ax,miny ! mov f1,ax ; F1 is raster counter 0535 8B1E11022BD8 R mov bx,maxy ! sub bx,ax ; maxRATCH(0:i) has X coord pairs 0570 8B362102 R mov SI,f1 0574 89360000 E mov yad,SI 0578 81E60700 And SI,7 057C F7DE Neg SI 057E 83C607 18 ; ; FILL_OUTLINE: 05DD B8FFFF Mov AX,0FFFFH ;line style of solid 05E0 E832FC 0215 Call F_POLY_1 05E3 Cy-miny gives... 053B 891E1502 R mov count,bx ; is number of lines 053F 7503 0544 Jnz RASTER_LOOP ; if any lines 0541 E99900 05DD Jmp FILL_OUTLI Add SI,7 ;point to wrong end of character 0581 03360B02 R Add SI,FILL_MASK_BASE 0585 8A04 Mov AL,[SI] 0587 8AE0 Mov AH,AL 0589 BB2302 R 47E0A Les DI,PTSIN[BP] 05E6 268B05 Mov AX,ES:W_1[DI] ;get first X 05E9 A30000 E Mov XAD,AX 05EC 268B4502 MOv AX,ES:W_2[DI] 05F0 A30000 ENE ;else just outline ; For each raster line...... raster_loop: 0544 C70617020000 R mov jint,0 ; intersection index 054A 8B0E1F02  mov bx,offset scratch drwlp: 058C 50 Push AX 058D 53 Push BX 058E 8B0F Mov CX,[BX] 0590 890E0000 E Mov  Mov YAD,AX 05F3 8B1E1F02 R Mov BX,NUMSAV 05F7 D1E3 Shl BX,1 05F9 D1E3 Shl BX,1 ;BX -> at last pair 05FB 03FB Add  R mov cx,numsav ; for J = num-1 to 1 by -1 054E C4760A Les SI,PTSIN[BP] ; For each vertice.... vertice_loop: 0551 51  XAD,CX 0594 81E10F00 And CX,0FH 0598 D3C8 Ror AX,CL 059A A30000 E Mov GRTEXTP_W,AX ;set up pattern 059D 8B4702 Mov AX,2[BX] 05A0 2B DI,BX 05FD B90100 Mov CX,1 0600 E844FC 0247 Call PLYLP_1 f_fill_exit: no_int: ; here for short jumps... 0603 C3  push cx 0552 8D7C04 lea di,4[si] ; addr(PTSIN((J+1)*2) 0555 56 push si 0556 E8AB00 0604 call compute_intercept 0559 5E 060000 E Sub AX,XAD ;get delta 05A4 A30000 E Mov GRVECTDC,AX 05A7 F7D8 Neg AX 05A9 A30000 E Mov GRVECTD,AX 05AC D1E0  ret compute_intercept: ; ES:SI -> x1, y1 ; ES:DI -> x2,y2, F1 = Y 0604 268B5D02262B mov bx,es:2[di] ! sub bx,es:2[si] ; compute Y2-Y1 pop si 055A 83C604 add si,4 055D 59 pop cx 055E E2F1 0551 loop vertice_loop ; Now, connect last and first 0560 C47E0A les di,ptsin[ Shl AX,1 05AE A30000 E Mov GRVECTD2,AX 05B1 C70600000000 E Mov GRVECTD1,0 05B7 C60600000A E Mov GRVECTP1,0AH ;vector dir 2 05BC E80000 E Call GRTE 5C02 060C 74F5 0603 jz no_int ; no horizontals allowed 060E A12102 R mov ax,f1 ; get Y 0611 8BC8262B4C02 mov cx,ax ! sub cx,es:2[si]BP] 0563 E89E00 0604 call compute_intercept CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 PAGE 17 ; Now, fill between each pair of X intercXTW 05BF E89307 0D55 Call CVECTE 05C2 5B Pop BX 05C3 58 Pop AX NXT_PAIR: 05C4 83C304 Add BX,4 05C7 FF0E1902 R  ; Y - Y1 0617 262B4502 sub ax,es:2[di] ; Y - Y2 061B 33C179E4 0603 xor ax,cx ! jns no_int ; if signs equal, not on line epts of this raster line 0566 A11702 R mov ax,jint ; get number of X intercepts 0569 D1E8 shr ax,1 ; jint/2 # of pairs 056B 7463 05D0  Dec I ;count down loop 05CB 7403 05D0 Jz NXTPT 05CD E9BCFF 058C Jmp DRWLP ; 05D0 FF062102 R nxtpt: inc f1 05D4 FF0E1502 R ; here if Y is within line segment ; compute hi and lo intercepts ; and insert them into the list 061F 268B05262B04  jz nxtpt ; no pairs, nothing to fill 056D A31902 R mov I,ax ; is the loop index ; F1 is the raster line (Y) ; SC dec count 05D8 7403 05DD jz FILL_OUTLINE 05DA E967FF 0544 jmp RASTER_LOOP CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 PAGE 3  mov ax,es:0[di] ! sub ax,es:0[si] ; X2 - X1 0625 D1E1 shl cx,1 ; (Y-Y1)*2 so we can half round 0627 F7E9 imul cx ; (x2-x1) * (t add to end scanmatch: ; have match, move rest of list out one 065E 8B3E1702 R mov di,jint ; get current length 0662 D1E7 shl di,1 ; *2  Mov AX,ES:W_4[DI] ;get the upper Y 06A3 A30000 E Mov YAD,AX ;save it 06A6 268B4D02 Mov CX,ES:W_2[DI] ;get lower Y 06AA 2BC1y-y1+1/2)*2 0629 F7FB idiv bx ; / (y2-y1) 062B 40D1F8 inc ax ! sar ax,1 ; +1/2 and half round 062E 260304 add ax,es:0[si] is length of word array 0664 81C72302 R add di,offset scratch ; destination is end of scratch 0668 8D75FE lea si,(-2)[di] ; source is last element 066B FDF3A5FC std ! rep movsw ! cld  Sub AX,CX ;calculate delta Y 06AC 33D2 Xor DX,DX CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 PAGE 20  ; + X1 is X intercept ; insert AX into SCRATCH before first greater element ; (this maintains the list in sorted order) insert_list: 0631 06  ; move rest of list (backwards) insert_store: 066F AB stosw ; store intercept 0670 FF061702 R inc JINT ; bump length 0674 07  06AE F7F3 Div BX ;divide for repeat count 06B0 A3FF00 R Mov CA_REP_COUNT_Y,AX ;save the Y rep count 06B3 268B0D Mov CX,ES:W_1[DI]  Push ES 0632 268B1C268B0D mov bx,es:0[si] ! mov cx,es:0[di] ; get X1 and X2 0638 3BD97E02 063E cmp bx,cx ! jng no_swap_1 ; insure BX is smaller of two CP/M RASM86 0.2 SOURCE: DD Pop ES 0675 C3 ret ; ; ;The following routine fills a cell array with the data and attributes passed ;in CONTRL & ;get left X 06B6 890E0501 R Mov CA_XAD,CX ;save it 06BA 268B4504 Mov AX,ES:W_3[DI] ;get right X 06BE 2BC1 Sub AX,CX NECAPC.A86 PAGE 19 063C 87D9 xchg bx,cx ; no, swap 'em no_swap_1: 063E 3BC37D02 0644  PTSIN ;ENTRY: ; SS:BP -> stacked long word pointers ; ES:DI -> CONTRL array F_CELL_ARRAY: 0676 FF36FD00 R Push wo ;compute DELTA X 06C0 33D2 Xor DX,DX ;clear AX 06C2 F7F6 Div SI ;calculate X repeat count 06C4 40  cmp ax,bx ! jnl il_1 ; see if AX is left of endpoint 0642 8BC3 mov ax,bx ; yes, limit it to edge il_1: 0644 3BC17E02 064A cmp ax,cx ! jng il_2 ; see if AX is right ofrd ptr NEC_MODE ;save the current writing mode 067A 268B5D10 Mov BX,ES:W_9[DI] ;get the selected writing mode 067E 81E30300 And BX,3 ;mask into rea Inc AX 06C5 A30000 E Mov GRVECTDC,AX ;set up draw count 06C8 F7D8 Neg AX 06CA A30000 E Mov GRVECTD,AX 06CD D1E0 Shl AX,1 other end 0648 8BC1 mov ax,cx ; yes, limit to other edge il_2: 064A 8CDB8EC3 mov bx,ds ! mov es,bx ; insure destination in our data segment 064E BF2302 lity 0682 8A87B601 R Mov AL,MODE_MAP_TABLE[BX] ;get the nec mode 0686 A2FD00 R Mov NEC_MODE,AL ;save it 0689 268B5D0E Mov BX,ES:W_8[DI]  06CF A30000 E Mov GRVECTD2,AX 06D2 C70600000000 E Mov GRVECTD1,0 06D8 C60600000A E Mov GRVECTP1,0AH ;vector direction 2 06DD C7060000FFFF E Mov GRTEXTP_R mov di,offset scratch ; point to start of list 0651 8B0E1702 R mov cx,JINT ; get length of list 0655 E318 066F jcxz insert_store ; if list empty, skip scan  ;get the row count 068D 268B750C Mov SI,ES:W_7[DI] ;get the element count 0691 89360101 R Mov CA_ELEMENT_COUNT,SI ;save it 0695 268B450A Mov AX,ES:W_6[DW,0FFFFH ;line style to solid 06E3 E80000 E Call GRTEXTW 06E6 C47E02 Les DI,CONTRL[BP] 06E9 268B4D0E Mov CX,ES:W_8[DI] ;get the row count 06ED  scanloop: 0657 AF7C04 065E scasw ! jl scanmatch ; see if less than this one 065A E2FB 0657 loop scanloop ; no, try next 065C EB11 066F jmps insert_store ; greater than all, jusI] ;get the row length 0699 A30301 R Mov CA_ROW_LENGTH,AX ;save it for later 069C C47E0A Les DI,PTSIN[BP] ;point at input vertices 069F 268B4506 4 C47E06 Les DI,INTIN[BP] ;point at the cell array F_CELL_ARRAY_Y_LOOP: 06F0 51 Push CX ;stack the row count 06F1 8B0EFF00  E Add XAD,AX ;move the XAD 072A E2D7 0703 Loop DO_NEXT_CA_X ;if not the last element 072C FF0E0000 E Dec YAD ;move dowov GRZOOMP,0 076C E80000 E Call GRZOOM 076F 8F060000 E Pop word ptr GRZOOMP 0773 8B1EE800 R MOV BX,FILL_COLOR ;get the color 0777 8A87AE01 R Mo R Mov CX,CA_REP_COUNT_Y ;get the Y repeat count DO_NEXT_CA_Y: 06F5 51 Push CX 06F6 BB0000 Mov BX,0 ;zero the elemn on Y axis 0730 59 Pop CX ;get the Y repeat count 0731 E2C2 06F5 Loop DO_NEXT_CA_Y ;if not last then loop 0733 59 Pop CX v AL,COLOR_MAP_TABLE[BX] 077B A2FE00 R Mov NEC_COLOR,AL 077E A1E400 R Mov AX,FILL_INTERIOR ;get the interior type 0781 3D0000 Cmp AX,0 ent counter 06F9 8B0E0101 R Mov CX,CA_ELEMENT_COUNT ;get the X element count 06FD A10501 R Mov AX,CA_XAD 0700 A30000 E Mov XAD,AX DO_NEXT_CA_X:  0734 033E0301 R Add DI,CA_ROW_LENGTH ;move to the next row 0738 033E0301 R Add DI,CA_ROW_LENGTH ;its a word array 073C E2B2 06F0 Loop F_CELL_ARRAY_Y_LOOP  ;is it hollow ? 0784 7503 0789 Jnz FILLED_BAR 0786 E94F00 07D8 Jmp HOLLOW_BAR ;yes then leap FILLED_BAR: 0789 BB0000 Mov BX,0  0703 268B31 Mov SI,ES:[DI+BX] ;get the next element 0706 B80700 Mov AX,7 ;get max color 0709 3BF0 Cmp SI,AX  F_CELL_ARRAY_DONE: 073E 8F06FD00 R Pop word ptr NEC_MODE ;restore the writing mode 0742 C3 Ret ; ;The following rou ;first style is BLOT 078C 3D0100 Cmp AX,1 ;is it solid ? 078F 7404 0795 Jz DO_BAR 0791 8B1EE600 R Mov BX,FILL_STYLE  ;above the max 070B 7602 070F Jbe DO_CA_COLOR ;no then leap 070D 8BF0 Mov SI,AX ;else stick at max DO_CA_COLOR: 070F 8A84Atine dispacthes to the selected generlized drawing primitive ;ENTRY: ; SS:BP -> stacked long word pointers ; ES:DI -> CONTRL(1) F_GENERA;get the style index ; DO_BAR: CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 PAGE 22 0795 B90300 Mov CX,E01 R Mov AL,COLOR_MAP_TABLE[SI] ;get the nec color 0713 A2FE00 R Mov NEC_COLOR,AL ;save it for line draw 0716 06 Push ES 0717 57 LIZED_DRAWING_PRIMITIVE: 0743 268B5D0A Mov BX,ES:W_6[DI] ;get the GDP op code 0747 83FB07 Cmp BX,LAST_GDP ;too big ? 074A 7601 074D Jbe DO_GDP3 0798 D3E3 Shl BX,CL ;mul by 8 079A BE0000 E Mov SI,offset CHARACTER_BIT_TABLE ;point at the character table 079D 03F3 Add SI,BX 079F BF0000  Push DI 0718 53 Push BX 0719 51 Push CX 071A E83806 0D55 Call CVECTE 071D 59 Pop CX 071E 5B Pop BX 071F ;no the lets do it 074C C3 Ret DO_GDP: 074D 53 Push BX ;save the pointer 074E C606000020 E Mov G E MOV DI,OFFSET GRTEXTP1 07A2 8CD8 MOV AX,DS 07A4 8EC0 MOV ES,AX 07A6 B90400 MOV CX,4 07A9 F3A5 Rep MOVSW  5F Pop DI 0720 07 Pop ES 0721 43 Inc BX ;bump the element pointer 0722 43 Inc BX RWRT,GRWRTW ;set mode to write 0753 C7060000FFFF E Mov GRMASK_W,0FFFFH 0759 E80000 E Call GRMASK 075C 5B Pop BX 075D D1E3 Shl BX,1 0 ; 07AB C47E0A Les DI,PTSIN[BP] ;ES:DI -> input data 07AE 268B05 Mov AX,ES:W_1[DI] 07B1 A30000 E Mov XAD,AX ;set up start ;by a word CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 PAGE 21 0723 A10000 E Mov AX,GRVECTDC ;get the vector length 0726 01060000 75F FFA76E00 R Jmp GDP_TABLE[BX] ;leap to the routine ; F_GDP_BAR: 0763 FF360000 E Push word ptr GRZOOMP 0767 C606000000 E M4  X 07B4 268B4D04 Mov CX,ES:W_3[DI] 07B8 2BC8 Sub CX,AX ;delta X 07BA 268B4502 MOV AX,ES:W_2[DI] 07BE A30000 E Mov YAD,AX 07C Ret ; F_GDP_PIESLICE: CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 PAGE 23 0821 C3  BX,1 ;2(R-1) 086C 891E0000 E Mov GRVECTD2,BX ;stash it in the structure 0870 C7060000FFFF E Mov GRVECTD1,-1 ;set up the constants 0876 C70600000000 E Mov1 268B5506 Mov DX,ES:W_4[DI] 07C5 2BD0 SUB DX,AX ; DELTA Y 07C7 4A Dec DX ;-1 07C8 89160000 E MOV  Ret ; F_GDP_CIRCLE: 0822 C7060000FFFF E Mov GRTEXTP_W,0FFFFH ;set up the line style 0828 E80000 E Call GRTEXTW 082B 8B1EE800 R Mov  GRVECTDM,0 GDP_CIRCLE_LOOP: 087C 268B05 Mov AX,ES:W_1[DI] ;get the center X 087F 26034508 Add AX,ES:W_5[DI] ;add in the radius 0883 A30000 E  GRVECTDC,DX 07CC 890E0000 E MOV GRVECTD,CX 07D0 C606000012 E Mov GRVECTP1,012H ;area fill dir 2 07D5 E875FC 044D Call DISPLAY_PATTERN ;go do it  BX,FILL_COLOR ;get the color index 082F 8A87AE01 R Mov AL,COLOR_MAP_TABLE[BX] 0833 A2FE00 R Mov NEC_COLOR,AL ;save the selected color 0836 E81B00 0854 Call DO_GDP_ Mov XAD,AX ;save it 0886 268B4502 Mov AX,ES:W_2[DI] ;get center Y 088A A30000 E Mov YAD,AX 088D C606000027 E Mov GRVECTP1,27H ;arc 7  ; HOLLOW_BAR: 07D8 C7060000FFFF E Mov GRTEXTP_W,0FFFFH ;set up the outline style 07DE E80000 E Call GRTEXTW 07E1 C47E0A Les DI,CIRCLE ;do the selected size 0839 833EE40000 R Cmp FILL_INTERIOR,0 ;is it hollow ? 083E 7413 0853 Jz GDP_CIRCLE_DONE ;yes then leap FILL_CIRCLE_LOOP: 0840  0892 E8C004 0D55 Call CVECTE 0895 C606000024 E Mov GRVECTP1,24H ;arc 4 089A E8B804 0D55 Call CVECTE 089D C47E0A Les DI,PTSIN[BP] 08A0 268B05 PTSIN[BP] ;ES:DI -> input data 07E4 268B05 Mov AX,ES:W_1[DI] 07E7 A30000 E Mov XAD,AX ;set up start X 07EA 268B4D04 Mov CX,ES:W_3[DI] C47E0A Les DI,PTSIN[BP] ;point at the points in 0843 26837D0800 Cmp ES:W_5[DI],0 ;is radius zero ? 0848 7409 0853 Jz GDP_CIRCLE_DONE ;yes then leap 084 Mov AX,ES:W_1[DI] 08A3 A30000 E Mov XAD,AX 08A6 268B4502 Mov AX,ES:W_2[DI] 08AA 26034508 Add AX,ES:W_5[DI] 08AE A30000 E Mov YAD,AX 08B1 C606 07EE 2BC8 Sub CX,AX ;delta X 07F0 268B4502 MOV AX,ES:W_2[DI] 07F4 A30000 E Mov YAD,AX 07F7 268B5506 Mov DX,ES:W_4[DI] 07FB 2BA 26FF4D08 Dec ES:W_5[DI] ;else lets do the next one 084E E80300 0854 Call DO_GDP_CIRCLE 0851 EBED 0840 Jmps FILL_CIRCLE_LOOP GDP_CIRCLE_DONE: 0853000021 E Mov GRVECTP1,21H ;arc 1 08B6 E89C04 0D55 Call CVECTE CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 PAGE 24 08B9 C606000026 D0 SUB DX,AX ; DELTA Y 07FD 4A Dec DX ;-1 07FE 49 Dec CX ;-1 07FF 89160000 E  C3 Ret ; DO_GDP_CIRCLE: 0854 C47E0A Les DI,PTSIN[BP] ;point to the points in array 0857 268B5D08 Mov BX,ES:W_5[DI E Mov GRVECTP1,26H ;arc 6 08BE E89404 0D55 Call CVECTE 08C1 C47E0A Les DI,PTSIN[BP] 08C4 268B05 Mov AX,ES:W_1[DI] 08C7 262B4508 Sub MOV GRVECTD2,DX 0803 890E0000 E MOV GRVECTD,CX 0807 890E0000 E Mov GRVECTDM,CX 080B C606000042 E Mov GRVECTP1,042H ;rectangle dir 2 0810 C70600000300 E ] ;get the radius 085B B805B5 Mov AX,0B505H ;pick up 1/1.41 (0B505H) 085E 43 Inc BX 085F F7E3 Mul BX 0861 89160000 E Mov G AX,ES:W_5[DI] 08CB A30000 E Mov XAD,AX 08CE 268B4502 Mov AX,ES:W_2[DI] 08D2 A30000 E Mov YAD,AX 08D5 C606000023 E Mov GRVECTP1,23H ;arc 3 08DA Mov GRVECTDC,3 0816 C7060000FFFF E Mov GRVECTD1,-1 081C E83605 0D55 Call CVECTE 081F C3 Ret ; F_GDP_ARC: 0820 C3 RVECTDC,DX ;stash it in the structure 0865 4B Dec BX ;R-1 0866 891E0000 E Mov GRVECTD,BX ;stash it in the structure 086A D1E3 Shl 5  E87804 0D55 Call CVECTE 08DD C606000020 E Mov GRVECTP1,20H ;arc 0 08E2 E87004 0D55 Call CVECTE 08E5 C47E0A Les DI,PTSIN[BP] 08E8 268B05  BX,AX ;get size into BX 0927 B80F00 Mov AX,15 ;get the max size 092A 3BD8 Cmp BX,AX ;too big 092C 7702 0930 Ja SET_CHAR Les DI,INTIN[BP] ;ES:DI -> integer input array 095B 268B05 Mov AX,ES:[DI] ;get the requested direction 095E 05E100 Add AX,225 ;bias by 1/2 octent 0961 3 Mov AX,ES:W_1[DI] 08EB A30000 E Mov XAD,AX 08EE 268B4502 Mov AX,ES:W_2[DI] 08F2 262B4508 Sub AX,ES:W_5[DI] 08F6 A30000 E Mov YAD,AX 08F9 C606000025ACTER_HEIGHT 092E 8BC3 Mov AX,BX ;else get the size SET_CHARACTER_HEIGHT: CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 3D2 Xor DX,DX ;clear DH 0963 BBC201 Mov BX,450 ;pick up 45 degrees 0966 F7F3 Div BX ;chug chug chug 0968 050200  E Mov GRVECTP1,25H ;arc 5 08FE E85404 0D55 Call CVECTE 0901 C606000022 E Mov GRVECTP1,22H ;arc 2 0906 E84C04 0D55 Call CVECTE 0909 C3  PAGE 25 0930 A2FB00 R Mov TEXT_NEC_SIZE,AL ;and save it 0933 40 Inc AX ;make it one relative to scale 0934 8BD8 Mov BX,AX  Add AX,2 ;bias into nec land 096B 250700 And AX,07H ;mask into reality 096E A2FA00 R Mov TEXT_NEC_DIRECTION,AL ;save the computed nec direction  Ret ; F_GDP_PGC: 090A C3 Ret ; ;The following routine sets the character height in device units  ;put in BX to multiply 0936 C47E12 Les DI,PTSOUT[BP] ;get the output array pointer 0939 B80500 Mov AX,5 ;characters are 5 pixels wide 093C F6E3 code 0971 D1E0 Shl AX,1 ;make it a word pointer 0973 05BB01 R Add AX,offset ROTATION_MAP_TABLE 0976 8BF0 Mov SI,AX 0978 AD Lods ;ENTRY: ; SS:BP -> stacked long word pointers ; ES:DI -> CONTRL(1) ;EXIT: ; CONTRL(3) = 2  Mul BL ;scale by size 093E 268905 Mov ES:W_1[DI],AX ;report the scaled character width 0941 B80700 Mov AX,7 0944 F6E3 Mul BL 0946 26894w ;get the direction in 1/10 degrees 0979 C47E0E Les DI,INTOUT[BP] ;ES:DI -> integer output array 097C 268905 Mov ES:[DI],AX ;drop in the result 097F C ; PTSOUT(1) - PTSOUT(4) filled with arguments F_SET_CHARACTER_HEIGHT: 090B 26C745040200 Mov ES:W_3[DI],2 ;set up contrl(3) 0911 C47E0A Les DI,PTSIN[BP] 502 Mov ES:W_2[DI],AX ;report scaled character height 094A B80800 Mov AX,8 094D F6E3 Mul BL 094F 26894504 Mov ES:W_3[DI],AX ;report 3 Ret ; ;The following routine set the color map value for the index requested in INTIN ;based on the values requested in INTIN(2) - INTIN(4) ;ES:DI -> PTSIN(1) 0914 268B4502 Mov AX,ES:W_2[DI] ;get the requested character height 0918 40 Inc AX ;make it one relative 0919 B307 Mov BLscaled cell width 0953 26894506 Mov ES:W_4[DI],AX ;report scaled cell height 0957 C3 Ret ; ;The following routine sets the character up vect ;ENTRY: ; SS:BP -> stacked arguments ; ES:DI -> CONTRL(1) ;EXIT: ; F_SET_COLOR_REPRESENTAT,7 ;height of character in pixels 091B F6F3 Div BL ;compute nearest size 091D 32E4 Xor AH,AH ;zero the remainder 091F 3D0000 or ;based on the angle of rotation passed in INTIN(1) in 1/10 of degrees ;ENTRY: ; SS:BP -> stacked long word pointers ; ES:DI -> CONTION: 0980 C47E06 Les DI,INTIN[BP] ;get the long pointer 0983 268B1D Mov BX,ES:[DI] ;get the color index CP/M RASM86 0.2 SOURCE: DDNECAPC.A86  Cmp AX,0 ;min height ? 0922 740C 0930 Jz SET_CHARACTER_HEIGHT ;yes then leap 0924 48 Dec AX ;round down 0925 8BD8 Mov RL(1) ; INTIN(1) = Theta in 1/10 degrees ;EXIT: ; INTOUT(1) = Theta selected F_SET_CHARACTER_UP_VECTOR: 0958 C47E06 5  PAGE 26 0986 83FB07 Cmp BX,7 ;is it too big ? 0989 7729 09B4 Ja F_S_C_R_DONE ;yes then do nothing 098B B80600 0 Cmp AX,7 ;OK ? 09BE 7603 09C3 Jbe SET_POLYLINE_TYPE 09C0 B80700 Mov AX,7 SET_POLYLINE_TYPE: 09C3 C47E0E Les  Ret ; ;The following routine sets the poly marker type ;ENTRY: ; SS:SP -> stacked long word pointers F Mov AX,6 ;get bytes per index for request array 098E F6E3 Mul BL ;scale the index 0990 8BF0 Mov SI,AX ;put it in SI 0992 81C67E01  DI,INTOUT[BP] ;point at the output array 09C6 A3D800 R Mov POLYLINE_TYPE,AX ;save the selected line type 09C9 268905 Mov ES:[DI],AX ;and return it 09CC C3 _SET_POLYMARKER_TYPE: 09FA C47E06 Les DI,INTIN[BP] ;ES:DI -> integer input array 09FD 268B05 Mov AX,ES:[DI] ;get the requested marker 0A00 3D0500 Cmp A R Add SI,offset COLOR_REQUEST_ARRAY 0996 BA0100 Mov DX,BIT_RED ;DH will accumulate DL is first mask 0999 B90300 Mov CX,3 ;how many colors  Ret ; ;The following routine sets the polyline width ;ENTRY: ; SS:BP -> stacked long word pointers F_SETX,5 ;max marker 0A03 7603 0A08 Jbe SET_MARKER_TYPE 0A05 B80500 Mov AX,5 SET_MARKER_TYPE: 0A08 C47E0E Les DI,INTOUT[BP] ;po F_S_C_R_LOOP: 099C 47 Inc DI 099D 47 Inc DI ;point at the next value 099E 268B05 Mov AX,ES:[DI] ;get it 09A1 8904 _POLYLINE_WIDTH: 09CD 26C745040100 Mov ES:W_3[DI],1 ;say one end point 09D3 C47E12 Les DI,PTSOUT[BP] ;point at the output array 09D6 26C7050100 Mov ES:W_1[DI],1 int at the output array 0A0B A3DC00 R Mov POLYMARKER_TYPE,AX ;save the selected type 0A0E 268905 Mov ES:[DI],AX ;and return the selected value 0A11 C3 Ret  Mov [SI],AX ;drop it into the request array 09A3 46 Inc SI ;and bump the pointer 09A4 46 Inc SI 09A5 3DF401 Cmp ;we support only one size 09DB 26C745020000 Mov ES:W_2[DI],0 ;clear the Y value 09E1 C3 Ret ; ;The following routine sets the poly line ; ;The following routine sets the poly marker scale ;ENTRY: ; SS:SP -> stacked long word pointers F_SET_POLYMARKER_SCAL AX,500 ;is it over 50% 09A8 7202 09AC Jb F_S_C_R_NEXT ;no then leap 09AA 0AF2 Or DH,DL ;else set the bit F_S_C_R_NEXT: 09 color index ;ENTRY: CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 PAGE 27 ; SS:SP -> stacked long word pointers E: 0A12 26C745040100 Mov ES:W_3[DI],1 ;set up contrl(3) 0A18 C47E0A Les DI,PTSIN[BP] ;ES:DI -> PTSIN(1) 0A1B 268B4502 Mov AX,ES:W_2[DI] ;get the requesAC D0E2 Shl DL,1 ;move the bit 09AE E2EC 099C Loop F_S_C_R_LOOP 09B0 88B7AE01 R Mov COLOR_MAP_TABLE[BX],DH ;move the color into the map  F_SET_POLYLINE_COLOR_INDEX: 09E2 C47E06 Les DI,INTIN[BP] ;ES:DI -> integer input array 09E5 268B05 Mov AX,ES:[DI] ;get the requested color index 09E8 3D0700 ted marker height 0A1F 40 Inc AX ;make it one relative 0A20 B307 Mov BL,7 ;height of marker in pixels 0A22 F6F3 Div BL F_S_C_R_DONE: 09B4 C3 Ret ; ;The following routine sets the poly line type ;ENTRY: ; SS:BP -> stacked long word poi Cmp AX,7 ;OK ? 09EB 7603 09F0 Jbe SET_POLYLINE_COLOR 09ED B80700 Mov AX,7 SET_POLYLINE_COLOR: 09F0 C47E0E Les DI ;compute nearest size 0A24 32E4 Xor AH,AH ;zero the remainder 0A26 3D0000 Cmp AX,0 ;too small ? 0A29 740C 0A37 Jz SET_MARKER_nters F_SET_POLYLINE_TYPE: 09B5 C47E06 Les DI,INTIN[BP] ;point at the input array 09B8 268B05 Mov AX,ES:W_1[DI] ;get the requested line style 09BB 3D070,INTOUT[BP] ;ES:DI -> integer output array 09F3 A3DA00 R Mov POLYLINE_COLOR,AX ;save the index 09F6 268905 Mov ES:[DI],AX ;drop it into the output array 09F9 C3 6 HEIGHT ;yes 0A2B 48 Dec AX ;make 0 relative 0A2C 8BD8 Mov BX,AX ;get size into BX 0A2E B80F00 Mov AX,15 ;ghe index 0A63 268905 Mov ES:[DI],AX ;drop it into the output array 0A66 C3 Ret ; ;The followung routine sets the text font selected  Cmp AX,7 ;OK ? 0A88 7603 0A8D Jbe SET_TEXT_COLOR_INDEX 0A8A B80700 Mov AX,7 ;force max color index SET_TEXT_COLOR_INDEX: 0A8et the max size 0A31 3BD8 Cmp BX,AX ;too big 0A33 7702 0A37 Ja SET_MARKER_HEIGHT 0A35 8BC3 Mov AX,BX ;else get the size  ;based on the font passed in INTIN(1) ;ENTRY: ; SS:BP -> stacked long word pointers ; ES:DI -> CONTRL(1) ; D C47E0E Les DI,INTOUT[BP] ;ES:DI -> integer output array 0A90 A3E200 R Mov TEXT_COLOR,AX ;save the index 0A93 268905 Mov ES:[DI],AX ;drop it into SET_MARKER_HEIGHT: 0A37 A2F900 R Mov POLYMARKER_NEC_SIZE,AL ;and save it 0A3A 40 Inc AX ;make it one relative to scale 0A3B 8BD8 Mov BX,AX  INTIN(1) = requested font ;EXIT: ; INTOUT(1) = selected font number F_SET_TEXT_FONT: 0A67 C47E06 Les DI,INTIN[BP] ;ES:DI -> intege the output array 0A96 C3 Ret ; ;The following routine sets the fill interior variable ;ENTRY: ; SS:SP -> stacked l ;put in BX to multiply 0A3D B80700 Mov AX,7 ;heigth of character in pixels CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 PAGE r input array 0A6A 268B05 Mov AX,ES:[DI] ;get the requested font 0A6D C47E0E Les DI,INTOUT[BP] ;point at the output array 0A70 3D0200 Cmp AX,2 ong word pointers ; ES:DI -> CONTROL(1) ;EXIT: ; INTOUT(1) set to interior selected F_SET_FILL_INTERIOR_STYLE: 0A97 C47E06 28 0A40 F6E3 Mul BL ;scale 0A42 C47E12 Les DI,PTSOUT[BP] ;get the output array pointer 0A45 26C7050000 Mov ES:W_1[DI],0 ;clear it  ;2 ? 0A73 7403 0A78 Jz SELECT_TEXT_FONT ;yes then leap 0A75 B80100 Mov AX,1 SELECT_TEXT_FONT: 0A78 A3E000 R Mov TEXT_FONT,AX  Les DI,INTIN[BP] ;ES:DI -> integer input 0A9A 268B05 Mov AX,ES:[DI] ;get requested interior 0A9D 3D0300 Cmp AX,3 ;OK 0AA0 7603 0AA5  0A4A 26894502 Mov ES:W_2[DI],AX ;report the scaled marker heigth 0A4E C3 Ret ; ;The following routine sets the polymarker color index  ;save the selected font 0A7B 268905 Mov ES:[DI],AX ;and return it 0A7E C3 Ret ; ;The following routine sets the text color  Jbe SET_FILL_INTERIOR 0AA2 B80000 Mov AX,0 ;force hollow SET_FILL_INTERIOR: 0AA5 A3E400 R Mov FILL_INTERIOR,AX ;save it 0AA8 C47E0E  ;ENTRY: ; SS:BP -> stacked long word pointers F_SET_POLYMARKER_COLOR_INDEX: 0A4F C47E06 Les DI,INTIN[BP] ;ES:DI -> integer input array 0 ;based on the color passed in INTIN(1) ;ENTRY: ; SS:BP -> stacked long word pointers ; ES:DI -> CONTRL(1) ; INTIN( Les DI,INTOUT[BP] ;ES:DI -> integer output 0AAB 268905 Mov ES:[DI],AX 0AAE C3 Ret ; ;The following routine sets the filA52 268B05 Mov AX,ES:[DI] ;get the requested color index 0A55 3D0700 Cmp AX,7 0A58 7603 0A5D Jbe SET_POLYMARKER_COLOR 0A5A B80700 Mov AX,7 1) = requested color ;EXIT: ; INTOUT(1) = selected color F_SET_TEXT_COLOR_INDEX: 0A7F C47E06 Les DI,INTIN[BP] ;ES:DI -> integer inpl style variable ;ENTRY: ; SS:SP -> stacked long pointers ;EXIT: ; INTOUT(1) set to style selected F_SET_FILL ;force max color SET_POLYMARKER_COLOR: 0A5D C47E0E Les DI,INTOUT[BP] ;ES:DI -> integer output array 0A60 A3DE00 R Mov POLYMARKER_COLOR,AX ;save tut array 0A82 268B05 Mov AX,ES:[DI] ;get the requested color index CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 PAGE 29 0A85 3D0700 6 _STYLE_INDEX: 0AAF C47E06 Les DI,INTIN[BP] ;ES:DI -> integer input 0AB2 268B05 Mov AX,ES:[DI] ;get the requested style 0AB5 3D7F00 Cmp AX,07FH ray 0AE2 B90300 Mov CX,3 ;3 colors R,G,B 0AE5 268B05 Mov AX,ES:W_1[DI] ;get the color index 0AE8 268B5D02 Mov BX,ES:W_2[DI]  ;The following routine gets input from the locator device ;ENTRY: ; SS:BP -> stacked long word pointers CP/M RASM86 0.2 SOURCE: DDNECAPC.A86  ;OK ? 0AB8 7603 0ABD Jbe SET_FILL_STYLE_INDEX 0ABA B80000 Mov AX,0 ;force solid style SET_FILL_STYLE_INDEX: 0ABD A3E600 R Mov  ;get the mode 0AEC C47E0E Les DI,INTOUT[BP] ;point at the output array 0AEF AB Stosw ;set the output color index 0AF0 93  PAGE 31 ; ;For sample mode ;EXIT: ; CONTRL(3) CONTRL(5) ;VALID KEY 1 FILL_STYLE,AX 0AC0 C47E0E Les DI,INTOUT[BP] 0AC3 268905 Mov ES:[DI],AX 0AC6 C3 Ret ; ;The following routine sets the fill Xchg AX,BX 0AF1 3D0000 Cmp AX,0 ;requested ? 0AF4 7414 0B0A Jz I_C_R_REQUESTED ;yes then leap 0AF6 8A97AE01 R Mov DL,COLOR_MAP_ 1 ;INVALID KEY 0 1 ;NO KEY 0 0 ;NEVER RETURN 1 0 ; F_INPUT_ color variable ;ENTRY: ; SS:SP -> stackes long word pointers ;EXIT: ; INTOUT(1) set to color F_SET_FILL_COLOTABLE[BX] ;get the current map value 0AFA B601 Mov DH,BIT_RED I_C_R_REALIZED: 0AFC 33C0 Xor AX,AX ;get a 0 0AFE 84D6 LOCATOR: 0B17 C47E0A Les DI,PTSIN[BP] ;point at starting X,Y 0B1A 268B05 Mov AX,ES:W_1[DI] ;get X 0B1D A30000 E Mov XAD,AX 0B20 268B4502 R_INDEX: 0AC7 C47E06 Les DI,INTIN[BP] ;ES:DI -> integer input 0ACA 268B05 Mov AX,ES:[DI] ;get the requested color CP/M RASM86 0.2 SOURCE: DDNECAPC.A86  Test DL,DH ;bit set ? 0B00 7402 0B04 Jz I_C_R_REAL ;no then leap 0B02 B410 Mov AH,10H I_C_R_REAL: 0B04 AB  Mov AX,ES:W_2[DI] ;get Y 0B24 A30000 E Mov YAD,AX 0B27 803E320101 R Cmp LOCATOR_MODE,1 ;request mode input 0B2C 753C 0B6A Jnz INPUT_LOCATOR_SAMPLE ;no then le PAGE 30 0ACD 3D0700 Cmp AX,07H ;OK ? 0AD0 7603 0AD5 Jbe SET_FILL_COLOR_INDEX 0AD2 B80700 Mov AX,7  Stosw 0B05 D0E6 Shl DH,1 ;move the mask 0B07 E2F3 0AFC Loop I_C_R_REALIZED 0B09 C3 Ret I_C_R_REQUESTED: 0ap F_INPUT_LOCATOR_REQUEST_LOOP: 0B2E E876F6 01A7 Call TOGGLE_INPUT_CURSOR ;make a cursor 0B31 E89702 0DCB Call GET_CHAR_NO_ECHO 0B34 50 Push AX  ;else clamp at max SET_FILL_COLOR_INDEX: 0AD5 C47E0E Les DI,INTOUT[BP] ;ES:DI -> integer output array 0AD8 A3E800 R Mov FILL_COLOR,AX ;save the indexB0A B006 Mov AL,6 0B0C F6E3 Mul BL 0B0E BE7E01 R Mov SI,offset COLOR_REQUEST_ARRAY 0B11 03F0 Add SI,AX ;SI -> requested  ;save the character 0B35 E86FF6 01A7 Call TOGGLE_INPUT_CURSOR ;cursor off 0B38 58 Pop AX 0B39 50 Push AX 0B3A E84F00 0B8C Call CHECK_LOC 0ADB 268905 Mov ES:[DI],AX ;drop it into the output array 0ADE C3 Ret ; ;The following reports the current color representation values 0B13 F3A5 Rep Movsw ;move the words 0B15 C3 Ret ; ;The following routine reports the pixel data at the selected cATOR_KEY ;move the stuff 0B3D 58 Pop AX 0B3E 74EE 0B2E Jz F_INPUT_LOCATOR_REQUEST_LOOP ;valid then loop 0B40 BB0100 Mov BX,1 ;return code of success ;ENTRY: ; SS:BP -> stackes long word pointers F_INQUIRE_COLOR_REPRESENTATION: 0ADF C47E06 Les DI,INTIN[BP] ;point at the input arell array ;ENTRY: ; SS:BP -> stacked long word pointers F_INQUIRE_CELL_ARRAY: 0B16 C3 Ret ; 7  0B43 B90100 Mov CX,1 ;on pair of coordinates F_INPUT_LOCATOR_DONE: 0B46 C47E0E Les DI,INTOUT[BP] ;point at integer out array 0B49 32E4  0B46 Jmps F_INPUT_LOCATOR_DONE ;leave ; ;The following routine checks the key code in AX for a valid key cursor key ;and moves the XAD,YAD with wrap around cheXAD,0 I_L_Y: 0BE3 A1ED02 R Mov AX,Y_MAX 0BE6 39060000 E Cmp YAD,AX 0BEA 7E03 0BEF Jle I_L_Y_0 0BEC A30000 E Mov YAD,AX  Xor AH,AH ;zero the high byte 0B4B 268905 Mov ES:W_1[DI],AX ;send the terminator back 0B4E C47E12 Les DI,PTSOUT[BP] ;point at points out array ck ;It returns AX,0 if the key was valid ; CHECK_LOCATOR_KEY: 0B8C BE0000 Mov SI,0 ;bias for UP 0B8F 3C0B  I_L_Y_0: 0BEF 833E000000 E Cmp YAD,0 0BF4 7D06 0BFC Jge CHECK_GRAPHIC_CURSOR_OK CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 PAGE 0B51 A10000 E Mov AX,XAD ;get X 0B54 268905 Mov ES:W_1[DI],AX ;send X back 0B57 A10000 E Mov AX,YAD ;get Y 0B5A 26894502  Cmp AL,0BH ;up ? 0B91 7421 0BB4 Jz CHECK_GRAPHIC_CURSOR 0B93 BE0800 Mov SI,8 0B96 3C0A Cmp AL,0AH 0B98 741A 0BB4 Jz CHECK_GRAPH33 0BF6 C70600000000 E Mov YAD,0 CHECK_GRAPHIC_CURSOR_OK: 0BFC 33C0 Xor AX,AX CHECK_GRAPHIC_CURSOR_DONE: 0BFE 0BC0 Or AX Mov ES:W_2[DI],AX ;send Y back 0B5E C47E02 Les DI,CONTRL[BP] ;point at CONTROL array 0B61 26894D04 Mov ES:W_3[DI],CX ;number of pairs 0 or 1 0B65 26895D08 IC_CURSOR 0B9A BE1000 Mov SI,16 0B9D 3C0C Cmp AL,0CH 0B9F 7413 0BB4 Jz CHECK_GRAPHIC_CURSOR 0BA1 BE1800 Mov SI,24 0BA4 3C1D ,AX ;set flags 0C00 C3 Ret ; ;The following routine gets input from the valuator device ;ENTRY:  Mov ES:W_5[DI],BX ;mark as successful or not 0B69 C3 Ret ; INPUT_LOCATOR_SAMPLE: 0B6A E84A02 0DB7 Call CON_STAT ;g Cmp AL,01DH 0BA6 740C 0BB4 Jz CHECK_GRAPHIC_CURSOR 0BA8 3C1C Cmp AL,01CH ;toggle speed ? 0BAA 7552 0BFE Jnz CHECK_GRAPHIC_CURSOR_DONE ;no then  ; SS:BP -> stacked long word pointers F_INPUT_VALUATOR: 0C01 C47E06 Les DI,INTIN[BP] ;point at input data 0C04 268B4D02 Mov CX,ES:W_2[DI] ;get the inet status 0B6D BB0000 Mov BX,0 ;un successfull code 0B70 B90000 Mov CX,0 ;no pairs 0B73 0BC0 Or AX,AX 0B75 74CF 0B46 return invalid 0BAC 81360F010400 R Xor INCREMENT_BIAS,100B ;toggle bias 0BB2 EB48 0BFC Jmps CHECK_GRAPHIC_CURSOR_OK ;send back a zero CHECK_GRAPHIC_CURSOR: 0BB4 0336itial value 0C08 803E330101 R Cmp VALUATOR_MODE,1 ;request mode 0C0D 751B 0C2A Jnz INPUT_VALUATOR_SAMPLE ;no then leap INPUT_VALUATOR_REQUEST_LOOP: 0C0F 51  Jz F_INPUT_LOCATOR_DONE ;no key then leap 0B77 E85802 0DD2 Call GET_CHAR ;get the key 0B7A 50 Push AX 0B7B E80E00 0B8C CAll CHECK_LOCATOR_KEY CP/M RASM86 0.0F01 R Add SI,INCREMENT_BIAS 0BB8 8B841101 R Mov AX,CURSOR_INCREMENT_TABLE[SI] 0BBC 01060000 E Add XAD,AX 0BC0 46 Inc SI 0BC1 46 In Push CX 0C10 E8B801 0DCB Call GET_CHAR_NO_ECHO ;get a character 0C13 59 Pop CX 0C14 E83100 0C48 Call CHECK_VALUATOR_KEY ;see it ok 0C17 74F6 0C0F 2 SOURCE: DDNECAPC.A86 PAGE 32 0B7E 58 Pop AX 0B7F BB0100 Mov BX,1 ;success at getting a key 0B82 B9c SI 0BC2 8B841101 R Mov AX,CURSOR_INCREMENT_TABLE[SI] 0BC6 01060000 E Add YAD,AX 0BCA A1EB02 R Mov AX,X_MAX 0BCD 39060000 E Cmp XAD,AX 0BD1 7E03  Jz INPUT_VALUATOR_REQUEST_LOOP ;yes then loop 0C19 BB0100 Mov BX,1 ;always OK INPUT_VALUATOR_DONE: 0C1C C47E0E Les DI,INTOUT[BP] ;0100 Mov CX,1 ;valid key 0B85 74BF 0B46 Jz F_INPUT_LOCATOR_DONE ;if valid then leap 0B87 B90000 Mov CX,0 ;invalid key 0B8A EBBA 0BD6 Jle I_L_X_0 0BD3 A30000 E Mov XAD,AX I_L_X_0: 0BD6 833E000000 E CMP XAD,0 0BDB 7D06 0BE3 Jge I_L_Y 0BDD C70600000000 E Mov 7 point at the output array 0C1F 26890D Mov ES:W_1[DI],CX ;save the current value 0C22 C47E02 Les DI,CONTRL[BP] 0C25 26895D08 Mov ES:W_5[DI],BX ;set or clear s ; F_INPUT_CHOICE: 0C59 26C745080000 Mov ES:W_5[DI],0 ;mark as unsuccessful 0C5F 803E340101 R Cmp CHOICE_MODE,1 ;request mode ? 0C64 742D CA5 3D8F00 Cmp AX,8FH 0CA8 76DB 0C85 Jbe INPUT_CHOICE_SAVE ;valid then leap I_C_R_BAD: 0CAA B90000 Mov CX,0 0CAD BB0000 uccess flag 0C29 C3 Ret ; INPUT_VALUATOR_SAMPLE: 0C2A 51 Push CX 0C2B E88901 0DB7 Call CON_STAT ;any one home 0C93 Jz INPUT_CHOICE_REQUEST ;yes then leap INPUT_CHOICE_SAMPLE: 0C66 E84E01 0DB7 Call CON_STAT ;any body home ? 0C69 7427 0C92 Jz  Mov BX,0 0CB0 EBD3 0C85 Jmps INPUT_CHOICE_SAVE CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 PAGE 35 ;  ? 0C2E 59 Pop CX 0C2F BB0000 Mov BX,0 ;un successful 0C32 0AC0 Or AL,AL 0C34 74E6 0C1C Jz INPUT_VALUATOR_DONE ;no then  INPUT_CHOICE_DONE ;no key then leap 0C6B E86401 0DD2 Call GET_CHAR ;get the character 0C6E BB0100 Mov BX,1 ;say we got a chatacter 0C71 8BC8 ;The following routing gets input from the string device ;ENTRY: ; SS:BP -> stacked long word pointers F_INPUT_STRING: 0CB2 C47E06 Les DI,INleap 0C36 51 Push CX 0C37 E89801 0DD2 Call GET_CHAR 0C3A 59 Pop CX 0C3B E80A00 0C48 Call CHECK_VALUATOR_KEY 0C3E BB0100 Mov BX Mov CX,AX 0C73 81E10F00 And CX,0FH 0C77 41 Inc CX 0C78 3D8000 Cmp AX,80H 0C7B 7205 0C82 Jb I_C_S_BAD TIN[BP] ;point to integer in array 0CB5 268B4D02 Mov CX,ES:W_2[DI] ;get max length 0CB9 268B4504 Mov AX,ES:W_3[DI] ;get echo mode 0CBD C47E0E ,1 0C41 74D9 0C1C Jz INPUT_VALUATOR_DONE 0C43 BB0000 Mov BX,0 ;no successful 0C46 EBD4 0C1C Jmps INPUT_VALUATOR_DONE ;  ;if invalid then leap 0C7D 3D8F00 Cmp AX,08FH 0C80 7603 0C85 Jbe INPUT_CHOICE_SAVE ;if valid then leap I_C_S_BAD: 0C82 B90000 Mov CX,0 Les DI,INTOUT[BP] ;point at the output string 0CC0 33DB Xor BX,BX ;clear the character count 0CC2 0BC0 Or AX,AX  CHECK_VALUATOR_KEY: 0C48 3C2B Cmp AL,'+' 0C4A 7503 0C4F Jnz C_V_K_1 0C4C 41 Inc CX ;bump count 0C4D EB09 0C58 Jmps C_ INPUT_CHOICE_SAVE: 0C85 C47E02 Les DI,CONTRL[BP] ;point at the contrl array 0C88 26895D08 Mov ES:W_5[DI],BX ;report success or failure 0C8 ;set flags 0CC4 741D 0CE3 Jz INPUT_STRING_NO_ECHO INPUT_STRING_ECHO: 0CC6 803E350101 R Cmp STRING_MODE,1 ;request ? 0CCB 7407 0CD4 Jz I_SV_K_OK C_V_K_1: 0C4F 3C2D Cmp AL,'-' CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 PAGE 34 0C51 7503 0C56 Jnz C C47E0E Les DI,INTOUT[BP] 0C8F 26890D Mov ES:W_1[DI],CX ;return the code 1 relative INPUT_CHOICE_DONE: 0C92 C3 Ret _E ;yes then leap 0CCD E8E700 0DB7 Call CON_STAT ;any characters 0CD0 0AC0 Or AL,AL 0CD2 742A 0CFE Jz INPUT_STRING_DONE  C_V_K_DONE 0C53 49 Dec CX 0C54 33C0 Xor AX,AX C_V_K_DONE: 0C56 0BC0 Or AX,AX C_V_K_OK: 0C58 C3  INPUT_CHOICE_REQUEST: 0C93 E83501 0DCB Call GET_CHAR_NO_ECHO 0C96 BB0100 Mov BX,1 0C99 8BC8 Mov CX,AX 0C9B 81E10F00 And CX,0FH 0C9F 41  ;no the leap I_S_E: 0CD4 E80F01 0DE6 Call GET_CHAR_ECHO 0CD7 3C0D Cmp AL,0DH ;done ? 0CD9 7423 0CFE Jz INPUT_STRING_DONE 0CD Ret ; ;The following routine gets input from the choice device ;ENTRY: ; SS:BP -> stacked long word pointers  Inc CX ;make one relative 0CA0 3D8000 Cmp AX,80H ;valid ? 0CA3 7205 0CAA Jb I_C_R_BAD ;no then leap 08 B 32E4 Xor AH,AH 0CDD AB Stosw ;save char as an integer 0CDE 43 Inc BX 0CDF E2E5 0CC6 Loop INPUT_STRING_ECHO 0CE SET_WRITING_MODE ;if to low then set the mode 0D14 83FB04 Cmp BX,4 0D17 7702 0D1B Ja SET_WRITING_MODE ;if to high then set the mode 0D19 8BC3 Mov BP] ;point at integer output array 0D4F 26894504 Mov ES:W_3[DI],AX ;send back the mode 0D53 C3 Ret ; ;The followin1 EB1B 0CFE Jmps INPUT_STRING_DONE ; INPUT_STRING_NO_ECHO: 0CE3 803E350101 R Cmp STRING_MODE,1 ;request ? 0CE8 7407 0CF1 J AX,BX ;else get the selected mode SET_WRITING_MODE: 0D1B C47E0E Les DI,INTOUT[BP] ;point at the output array 0D1E 268905 Mov ES:g routine writes an item to the meta file ;ENTRY: ; SS:BP -> stacked long word pointers F_WRITE_ITEM_TO_METAFILE: 0D54 C3 Ret z I_S_N_E ;yes then leap 0CEA E8CA00 0DB7 Call CON_STAT ;any characters 0CED 0AC0 Or AL,AL 0CEF 740D 0CFE Jz INPUT_STRING_DONE [DI],AX ;and return the selected mode 0D21 8BD8 Mov BX,AX 0D23 8A87B601 R Mov AL,MODE_MAP_TABLE[BX] ;get the magic byte 0D27 A2FD00 R Mov NEC_MODE, ; ;The following routine draws a vector in the selected color with the arguments ;placed at VECDAT ; 0D55 C606000000 E CVECTE: Mov GRCOLR,GPLANE 0D5A ;no then leap I_S_N_E: 0CF1 E8D700 0DCB Call GET_CHAR_NO_ECHO 0CF4 3C0D Cmp AL,0DH ;done ? 0CF6 7406 0CFE Jz INPUT_SAL ;save it for later 0D2A C3 Ret ; ;The following routine sets the input mode ;ENTRY: ; SS:BP  A0FD00 R Mov AL,NEC_MODE 0D5D F606FE0002 R Test NEC_COLOR,BIT_GREEN ;any green ? 0D62 7506 0D6A Jnz DO_GRN_VEC ;yes then do it 0D64 3C20 Cmp ATRING_DONE 0CF8 32E4 Xor AH,AH 0CFA AB Stosw ;save char as an integer 0CFB 43 Inc BX 0CFC E2E5 0CE3 Loop INPUT_S-> stacked long word pointers F_SET_INPUT_MODE: 0D2B C47E06 Les DI,INTIN[BP] 0D2E 268B1D Mov BX,ES:W_1[DI] ;get device pointer 0D31 268B4502 L,MODE_REP ;replace mode ? 0D66 7505 0D6D Jnz TRY_BLU_VEC ;no then leap CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 PAGE 37 0D68 B022 TRING_NO_ECHO INPUT_STRING_DONE: 0CFE C47E02 Les DI,CONTRL[BP] 0D01 26895D08 Mov ES:W_5[DI],BX ;save the length 0D05 C3 Ret  Mov AX,ES:W_2[DI] ;get the mode 0D35 3D0200 Cmp AX,2 ;sample ? 0D38 7403 0D3D Jz SET_INPUT_MODE ;yes then leap 0D3A B80100  Mov AL,MODE_RES ;else get clear mode DO_GRN_VEC: 0D6A E82D00 0D9A Call DO_VECTOR_WRITE TRY_BLU_VEC: 0D6D C606000001 E MOV  ; ;The following routine sets the writing mode ;ENTRY: ; SS:BP -> stacked long word pointers F_SET_WRITING_MODE: 0D06 C47 Mov AX,1 ;else force request SET_INPUT_MODE: 0D3D BE3101 R Mov SI,offset INPUT_MODE ;point at the table 0D40 83FB04 Cmp BX GRCOLR,BPLANE 0D72 A0FD00 R Mov AL,NEC_MODE 0D75 F606FE0004 R Test NEC_COLOR,BIT_BLUE 0D7A 7506 0D82 Jnz DO_BLU_VEC 0D7C 3C20 Cmp AL,MODE_REP 0D7E 7505 E06 Les DI,INTIN[BP] ;point at the input parameter CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 PAGE 36 0D09 268B1D Mo,4 ;device out of range 0D43 7603 0D48 Jbe SAVE_INPUT_MODE ;no then leap 0D45 BB0000 Mov BX,0 ;point to dummy  0D85 Jnz TRY_RED_VEC 0D80 B022 Mov AL,MODE_RES DO_BLU_VEC: 0D82 E81500 0D9A Call DO_VECTOR_WRITE TRY_RED_VEC: 0D85 C606000002 E v BX,ES:[DI] ;get the requested writing mode 0D0C B80100 Mov AX,1 ;get the default mode 0D0F 83FB00 Cmp BX,0 0D12 7407 0D1B Jz  SAVE_INPUT_MODE: 0D48 03F3 Add SI,BX ;point SI 0D4A 8804 Mov [SI],AL ;save the selected mode 0D4C C47E0E Les DI,INTOUT[8  MOV GRCOLR,RPLANE 0D8A A0FD00 R Mov AL,NEC_MODE 0D8D F606FE0001 R Test NEC_COLOR,BIT_RED 0D92 7506 0D9A Jnz DO_VECTOR_WRITE 0D94 3C20 Cmp AL,M ; ;The following routine gets a character using function 6 DIO GET_CHAR_NO_ECHO: 0DCB E8E9FF 0DB7 Call CON_STAT 0DCE 0AC0 Or AL,AL acter 0DFF C3 Ret ; CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 PAGE 39 ;******************************ODE_REP 0D96 751D 0DB5 Jnz VECTOR_WRITE_DONE 0D98 B022 Mov AL,MODE_RES DO_VECTOR_WRITE: 0D9A 3C20 Cmp AL,MODE_REP 0D9C 7502 0DA0  ;set flag 0DD0 74F9 0DCB Jz GET_CHAR_NO_ECHO GET_CHAR: 0DD2 06 Push ES 0DD3 57 Push DI 0DD4 56 Push SI *************************************** ;* GRAPHIC DISPLAY DATA AREA * ;*********************************************************************  Jnz DVW_SAVE_MODE 0D9E B023 Mov AL,MODE_SET DVW_SAVE_MODE: 0DA0 A20000 E Mov GRATTRIB,AL ;stash the writing mode 0DA3 B90000 Mov CX,0 0DD5 52 Push DX 0DD6 51 Push CX 0DD7 53 Push BX 0DD8 B106 Mov CL,6 ;BDOS direct I/O 0DDA BAFF00 M ; DSEG 027F MAX_X EQU 639 01DA MAX_Y EQU 474 ; PUBLIC X_MAX,Y_MAX  ;command only 0DA6 E80000 E Call GRWRITE ;set the writing mode 0DA9 E80000 E Call GRCSRO ;set us in the right page 0DAC B90B00 Mov CX,11 ;# of fig ov DX,0FFH ;input character 0DDD CDE0 Int BDOS ;ring CP/M-86 bell 0DDF 5B Pop BX 0DE0 59 Pop CX 0DE1 5A ; EXTRN GRTEXTP1:BYTE,GRTEXTP2:BYTE,GRATTRIB:BYTE EXTRN GRTEXTP_W:WORD EXTRN GRVECTP1:BYTE,GRVECTDC:WORD,GRVECTD:WORD parms 0DAF E80000 E Call GRVECTW ;load 'em up 0DB2 E80000 E Call GRVECTE ;draw it VECTOR_WRITE_DONE: 0DB5 C3 Ret  Pop DX 0DE2 5E Pop SI 0DE3 5F Pop DI 0DE4 07 Pop ES 0DE5 C3 Ret ; GET_CHA EXTRN GRVECTD2:WORD EXTRN GRVECTD1:WORD,GRVECTDM:WORD EXTRN GRATTRIB:BYTE EXTRN XAD:WORD,YAD:WORD EX ; F_RETURN: 0DB6 C3 Ret ; CON_STAT: 0DB7 06 Push ES 0DB8 57 Push DI 0DB9 56 R_ECHO: 0DE6 E8E2FF 0DCB Call GET_CHAR_NO_ECHO PUT_CHAR: 0DE9 50 Push AX ;save the character 0DEA 06 Push ES 0DEB 57 TRN GRCOLR:BYTE EXTRN GRWRT:BYTE,GRWRTP:WORD EXTRN GRMASK_L:BYTE EXTRN GRMASK_W:WORD EXTRN GRVECTP2:WORD,G Push SI 0DBA 52 Push DX 0DBB 51 Push CX 0DBC 53 Push BX 0DBD B106 Mov CL,6 0DBF BAFE00 Mov  Push DI 0DEC 56 Push SI 0DED 52 Push DX 0DEE 51 Push CX 0DEF 53 Push BX 0DF0 32F6 Xor DRVECTP4:WORD EXTRN GRZOOMP:BYTE ; EXTRN CHARACTER_BIT_TABLE:BYTE ; ; ; 0 DX,0FEH 0DC2 CDE0 Int BDOS 0DC4 5B Pop BX 0DC5 59 Pop CX 0DC6 5A Pop DX CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 H,DH 0DF2 8AD0 Mov DL,AL 0DF4 B106 Mov CL,6 0DF6 CDE0 Int BDOS 0DF8 5B Pop BX 0DF9 59 Pop CX 0DFA 5A 000 B60D FUNCTION_TABLE DW offset F_RETURN ;no function 0 0002 5200 DW offset F_OPEN_WORKSTATION ;function 1 0004 B800 DW  PAGE 38 0DC7 5E Pop SI 0DC8 5F Pop DI 0DC9 07 Pop ES 0DCA C3 Ret  Pop DX 0DFB 5E Pop SI 0DFC 5F Pop DI 0DFD 07 Pop ES 0DFE 58 Pop AX ;restore the char9  offset F_CLOSE_WORKSTATION ;function 2 0006 B900 DW offset F_CLEAR_WORKSTATION ;function 3 0008 C700 DW offset F_UPDATE_WORKSTATION ;functionset F_SET_FILL_INTERIOR_STYLE ;function 23 0030 AF0A DW offset F_SET_FILL_STYLE_INDEX ;function 24 0032 C70A DW offset F_SET_FILL_COLOR_INDEX ;function 2 DW offset F_ESCAPE_12 0060 4501 DW offset F_ESCAPE_13 0062 4A01 DW offset F_ESCAPE_14 0064 5701 DW offset F_ESCAPE_15 0066 8701 4 000A C800 DW offset F_ESCAPE ;function 5 000C 0002 DW offset F_POLYLINE ;function 6 000E 0C03 DW 5 0034 DF0A DW offset F_INQUIRE_COLOR_REPRESENTATION ;function 26 0036 160B DW offset F_INQUIRE_CELL_ARRAY ;function 27 0038 170B DW  DW offset F_ESCAPE_16 0068 9001 DW offset F_ESCAPE_17 006A 9101 DW offset F_ESCAPE_18 006C F201 DW offset offset F_POLYMARKER ;function 7 0010 8003 DW offset F_TEXT ;function 8 0012 B104 DW offset F_FILLED_AREA ;funct offset F_INPUT_LOCATOR ;function 28 003A 010C DW offset F_INPUT_VALUATOR ;function 29 003C 590C DW offset F_INPUT_CHOICE ;fu F_ESCAPE_19 ; 0007 LAST_GDP EQU 7 ;0 relative number of last 006E B60D GDP_TABLE DW offset F_RETURN ;no GDP 0 0070 6307ion 9 0014 7606 DW offset F_CELL_ARRAY ;function 10 0016 4307 DW offset F_GENERALIZED_DRAWING_PRIMITIVE ;function 11 0018 0B09 nction 30 003E B20C DW offset F_INPUT_STRING ;function 31 0040 060D DW offset F_SET_WRITING_MODE ;function 32 0042 2B0D  DW offset F_GDP_BAR 0072 2008 DW offset F_GDP_ARC 0074 2108 DW offset F_GDP_PIESLICE 0076 2208  DW offset F_SET_CHARACTER_HEIGHT ;function 12 001A 5809 DW offset F_SET_CHARACTER_UP_VECTOR ;function 13 001C 8009 DW offset F_SET_COLOR_REPRESENTATION  DW offset F_SET_INPUT_MODE ;function 33 0044 540D DW offset F_WRITE_ITEM_TO_METAFILE ;function 34 0022 MAX_FUNCTION EQU 34 ;la DW offset F_GDP_CIRCLE 0078 0A09 DW offset F_GDP_PGC 007A B60D DW offset F_RETURN 007C B60D DW o ;function 14 001E B509 DW offset F_SET_POLYLINE_TYPE ;function 15 0020 CD09 DW offset F_SET_POLYLINE_WIDTH ;function 16 0022 E209 st valid function code ; 0013 LAST_ESCAPE_CODE EQU 19 ;0 relative code number 0046 D800 ESCAPE_TABLE DW offset F_ESCAPE_0 0048 E800 ffset F_RETURN ; 007E 1200 ID_STRING DW length ID_TEXT 0080 31002E003100 ID_TEXT DW '1','.','1',' ','N','E','C',' ','A','P','C',' ','4','/','5', 20004E00450 DW offset F_SET_POLYLINE_COLOR_INDEX ;function 17 0024 FA09 DW offset F_SET_POLYMARKER_TYPE ;function 18 0026 120A DW offset F_SET_POLYMARKER_SCALE  DW offset F_ESCAPE_1 004A F700 DW offset F_ESCAPE_2 004C FB00 DW offset F_ESCAPE_3 004E FF00 DW offset F_ESCAPE_4 0050 00 '/','8 430020004100 500043002000 34002F003500 CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 PAGE 41 2F0038003300 ; 00A4  ;function 19 0028 4F0A DW offset F_SET_POLYMARKER_COLOR_INDEX ;function 20 002A 670A DW offset F_SET_TEXT_FONT ;function 21 002C 7F0A 301 DW offset F_ESCAPE_5 0052 0701 DW offset F_ESCAPE_6 0054 0B01 DW offset F_ESCAPE_7 0056 0F01 DW offset04001B005B00 ANSI_ERASE_TO_EOP DW 4,01BH,'[','0','J' 30004A00 00AE 04001B005B00 ANSI_ERASE_TO_EOL DW 4,01BH,'[','0','K' 30004B00 00B8 04001B005B00 ANSI_REVERSE_ON DW 4,01BH,'[','7',' DW offset F_SET_TEXT_COLOR_INDEX ;function 22 CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 PAGE 40 002E 970A DW off F_ESCAPE_8 0058 1501 DW offset F_ESCAPE_9 005A 1A01 DW offset F_ESCAPE_10 005C 1F01 DW offset F_ESCAPE_11 005E 3801 9 m' 37006D00 00C2 04001B005B00 ANSI_REVERSE_OFF DW 4,01BH,'[','0','m' 30006D00 00CC 04001B003D00 ADM3A_CURSOR_POSITION DW 4,01BH,'=' 00D2 0000 ADM3A_ROW DW 0 00D4 0000 000 CA_ROW_LENGTH DW 0 0105 0000 CA_XAD DW 0 ; 0107 0000 LAST_CURSOR_X DW 0 0109 0000 LAST_CURSOR_Y D ; 0000 GPLANE EQU 0 ;high address for plane 0001 BPLANE EQU 1 0002 RPLANE EQU 2 ;  ADM3A_COL DW 0 ; ;The following 10 word variables should not be disturbed ;because a Rep MOVSW is used to initilize them during F_OPEN_WORKSTW 0 CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 PAGE 42 ; 010B 0000 CURSOR_X DW 0 ;for locator input  0001 BIT_RED EQU 0001B 0002 BIT_GREEN EQU 0010B 0004 BIT_BLUE EQU 0100B ; 0020 MODE_RATION 00D6 0000 WORKSTATION_ID DW 0 00D8 0000 POLYLINE_TYPE DW 0 00DA 0000 POLYLINE_COLOR DW 0 00DC 0000 POLYMARKER_TYPE DW 0 00DE 010D 0000 CURSOR_Y DW 0 ; 010F 0000 INCREMENT_BIAS DW 0 ; 0111 0000 CURSOR_INCREMENT_TABLE DW 0 0113 0100 EP EQU 020H ;replace all bits with the pattern 0021 MODE_COM EQU 021H ;xor all bits with pattern 0022 MODE_RES EQU 022H ;reset 1 bits to 0 002 0000 POLYMARKER_COLOR DW 0 00E0 0000 TEXT_FONT DW 0 00E2 0000 TEXT_COLOR DW 0 00E4 0000 FILL_INTERIOR DW 0 00E6 0000  DW 1 0115 0000 DW 0 0117 0A00 DW 10 0119 0000 DW 0 011B FFFF 3 MODE_SET EQU 023H ;set 1 bits to 1 ; ; 0136 FFFF POLYLINE_TABLE DW 1111111111111111B ;no style 0 0138 FFFF  FILL_STYLE DW 0 00E8 0000 FILL_COLOR DW 0 ; ; 00EA 060501020704 DIRTBL DB 6,5,1,2,7,4,0,3 0003 00F2  DW -1 011D 0000 DW 0 011F F6FF DW -10 0121 0100 DW 1 0123 0000  DW 1111111111111111B ;style 1 solid CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 PAGE 43 013A 7F00 0000 NXTX DW 0 00F4 0000 NXTY DW 0 00F6 00 XSGN DB 0 00F7 00 YSGN DB 0  DW 0 0125 0A00 DW 10 0127 0000 DW 0 0129 FFFF DW -1 012B 0000  DW 0000000001111111B ;style 2 dashed 013C 1C1C DW 0001110000011100B ;style 3 dotted 013E 7F1C DW 0001110001111111B  ; 00F8 00 CURRENT_CHARACTER DB 0 00F9 00 POLYMARKER_NEC_SIZE DB 0 ; 00FA 02 TEXT_NEC_DIRECTION DB 2 00FB 00 TEXT_NE DW 0 012D F6FF DW -10 012F 0000 DW 0 ; 0131 00 INPUT_MODE DB 0 ;no  ;style 4 dashdot 0140 CCCC DW 1100110011001100B ;style 5 0142 AAAA DW 1010101010101010B ;style 6 0144 5555 C_SIZE DB 0 ;0 - 15 ; 00FC 02 NEC_DIRECTION DB 2 ;0-7 NEC 7220 driection 00FD 00 NEC_MODE DB 0 ; device 0 dummy entry 0132 00 LOCATOR_MODE DB 0 0133 00 VALUATOR_MODE DB 0 0134 00 CHOICE_MODE DB 0 0135 00 STRING_MODE D DW 0101010101010101B ;style 7 ; 0146 000000000000 DEFAULT_COLOR_DATA DW 0,0,0 ;black R,G,B 014C E80300000000 DW 00FE 00 NEC_COLOR DB 0 ;RBG from look up table ; 00FF 0000 CA_REP_COUNT_Y DW 0 0101 0000 CA_ELEMENT_COUNT DW 0 0103 0B 0 ; 0010 NEC_NORMAL_CHAR EQU 010H ;for normal graphics character 0090 NEC_SLANT_CHAR EQU 090H ;for italics :  1000,0,0 ;red 0152 0000E8030000 DW 0,1000,0 ;green 0158 00000000E803 DW 0,0,1000 ;blue 015E 0000E803E803  COLOR_MAP_TABLE DB 0 ;black 01AF 01 DB BIT_RED ;red 01B0 02 DB BIT_GREEN  ; 01CB 0000F8FF INCREMENT_TABLE DW 0,-8 ;0 01CF 0800F8FF DW 8,-8 ;1 01D3 08000000 DW 8,0 ;2 01D7 080 DW 0,1000,1000 ;cyan 0164 E803E8030000 DW 1000,1000,0 ;yellow 016A E8030000E803 DW 1000,0,1000  ;green 01B1 04 DB BIT_BLUE ;blue 01B2 06 DB BIT_GREEN+BIT_BLUE ;cyan 01B3 03 00800 DW 8,8 ;3 01DB 00000800 DW 0,8 ;4 01DF F8FF0800 DW -8,8 ;5 01E3 F8FF0000  ;magenta 0170 E803E803E803 DW 1000,1000,1000 ;white ; 0176 00 DB 0 ;black 0177 01  DB BIT_GREEN+BIT_RED ;yellow 01B4 05 DB BIT_BLUE+BIT_RED ;magenta 01B5 07 DB BIT_BLUE+BIT_RED+BIT_GREEN ;white  DW -8,0 ;6 01E7 F8FFF8FF DW -8,-8 ;7 ; 01EB FFFF0000 BASELINE_TABLE DW -1,0 ;0 01EF FFFFFFFF  DB BIT_RED ;red 0178 02 DB BIT_GREEN ;green 0179 04 DB BIT_BLUE  ; 01B6 20 MODE_MAP_TABLE DB MODE_REP ;replace (no mode 0) 01B7 20 DB MODE_REP ;replace 01B8 23  DW -1,-1 ;1 01F3 0000FFFF DW 0,-1 ;2 01F7 0100FFFF DW 1,-1 ;3 01FB 01000000  ;blue 017A 06 DB BIT_GREEN+BIT_BLUE ;cyan 017B 03 DB BIT_GREEN+BIT_RED ;yellow 017C 05  DB MODE_SET ;overstrike (set) 01B9 21 DB MODE_COM ;complement (xor) 01BA 22 DB MODE_RES ;erase (reset)  DW 1,0 ;4 01FF 01000100 DW 1,1 ;5 0203 00000100 DW 0,1 ;6 0207 FFFF0100 DW -1,1  DB BIT_BLUE+BIT_RED ;magenta 017D 07 DB BIT_BLUE+BIT_RED+BIT_GREEN ;white ; 017E 000000000000 COLOR_REQUEST_ARRAY DW 0,0,0  ; 01BB 8C0A ROTATION_MAP_TABLE DW 2700 ;nec 0 01BD 4E0C DW 3150 ;nec 1 CP/M RASM86 0.2 SOURCE: DDNECAPC.A86  ;7 ; 020B 0000 FILL_MASK_BASE DW 0 ; 020D ix rw 1 020F jx rw 1 0211 maxy rw  ;black R,G,B 0184 E80300000000 DW 1000,0,0 ;red 018A 0000E8030000 DW 0,1000,0 ;green 0190 00000000E803  PAGE 44 01BF 0000 DW 0 ;nec 2 01C1 C201 DW 450 ;nec 3 01C3 8403 DW  1 0213 miny rw 1 0215 count rw 1 0217 jint rw 1 0219 i rw 1 021B j rw 1 021D  DW 0,0,1000 ;blue 0196 0000E803E803 DW 0,1000,1000 ;cyan 019C E803E8030000 DW 1000,1000,0  900 ;nec 4 01C5 4605 DW 1350 ;nec 5 01C7 0807 DW 1800 ;nec 6 01C9 CA08 DW 2250  num rw 1 021F numsav rw 1 0221 f1 rw 1 0223 scratch rw 100 ;max intersections ; ;OP ;yellow 01A2 E8030000E803 DW 1000,0,1000 ;magenta 01A8 E803E803E803 DW 1000,1000,1000 ;white ; 01AE 00  ;nec 7 ; ;The following table of words are base scale values for the 8 different ;possible drawing directions of graphic text. They are ordered X,Y : EN_WORKSTATION_INTOUT 02EB 7F02 X_MAX DW MAX_X ;max width 0 relative 02ED DA01 Y_MAX DW MAX_Y ;max height 0 relative 02EF 0100  DW -1 ;GDP 9 031B FFFF DW -1 ;GDP 10 031D 0300 DW 3 ;GDP attributes 1 031F 0300 4B 7000 DW 112 ;max character height 034D 0100 DW 1 ;min line width 034F 0000 DW 0 0351 0100 DW 1 ;not precisely scaled 02F1 4001 DW 320 ;width of pixel in micrometers 02F3 4001 DW 320 ;height of pixel  DW 3 ;GDP attributes 2 0321 FFFF DW -1 ;GDP attributes 3 0323 FFFF DW -1 ;GDP attrib DW 1 ;max line width 0353 0000 DW 0 0355 0000 DW 0 0357 0700 DW in micrometers 02F5 1000 DW 16 ;number of character heights 02F7 0700 DW 7 ;number of line types 02F9 0100 utes 4 0325 FFFF DW -1 ;GDP attributes 5 0327 FFFF DW -1 ;GDP attributes 6 0329 FFFF DW -1  7 ;min marker height 0359 0000 DW 0 035B 7000 DW 112 ;max marker height ; 035D 1B CUR_A DW 1 ;number of line widths CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 PAGE 45 02FB 0500 DW 5  ;GDP attributes 7 032B FFFF DW -1 ;GDP attributes 8 032D FFFF DW -1 ;GDP attributes 9 032F FFFF DD_BUF DB 01BH CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 PAGE 46 035E 5B DB '[' 035F 3130 CUR_ROW DW 30 ;number of marker types 02FD 1000 DW 16 ;number of marker sizes 02FF 0200 DW 2 ;number of fonts 0301 8000  DW -1 ;GDP attributes 10 0331 0100 DW 1 ;color capability 0333 0100 DW 1 ;text rotation 0335 0100 31H 0361 3B DB ';' 0362 3130 CUR_COL DW 3031H 0364 52 DB 'R' ; CP/M RASM86 0.2 SOURCE: DDNECAPC.A86  DW 128 ;number of patterns 0303 0600 DW 6 ;number of hatch styles 0305 0800 DW 8 ;number of predefined color DW 1 ;fill capability 0337 0000 DW 0 ;pixel operation 0339 0800 DW 8 ;number of color PAGE 47 Eject Sseg ; Driver stack 0000 DriverStack Rs 512 s 0307 0200 DW 2 ;number of GDP's 0309 0100 DW 1 ;GDP 1 030B 0400 DW 4 ;GDP s in pallette 033B 0100 DW 1 ;number of locator devices 033D 0100 DW 1 ;number of valuator devices 033F 0100  ; Adjust before shipping 0200 DriverStackTop Rs 0 End END OF ASSEMBLY. NUMBER OF ERRORS: 0. USE FACTOR: 52%  ; CP/M RASM86 0.2 SOURCE: DDNECAPC.A86 2 030D FFFF DW -1 ;GDP 3 030F FFFF DW -1 ;GDP 4 0311 FFFF DW -1 ;GDP 5 0313 F DW 1 ;number of choice devices 0341 0100 DW 1 ;number of string devices 0343 0200 DW 2 ;type input/outFFF DW -1 ;GDP 6 0315 FFFF DW -1 ;GDP 7 0317 FFFF DW -1 ;GDP 8 0319 FFFF put ; 0345 0000 OPEN_WORKSTATION_PTSOUT DW 0 0347 0700 DW 7 ;min character height 0349 0000 DW 0 03;  CP/M RASM86 0.2 SOURCE: DDNECLIB.A86 PAGE 1 ;********************************************************************** ;* NPUT CX = XAD OUTPUT DX = EAD * ;* DX = YAD CL = DAD * ;**********************************************************************  0061 43 INC BX ; 0062 E2F9 005D LOOP GRSCRO010 ; 0064 C3 RET ; ;************************************* NEC DEVICE DRIVER FOR GSX - 86 * ;********************************************************************** DDRIVER CSEG PUBLIC GRRESET,G GRXYCV: 0028 8BC1 MOV AX,CX 002A 81E10F00 AND CX,000FH 002E 51 PUSH CX 002F B104 MOV CL,4 0031 D3F8 ********************************* ;* ALL SCREEN MEMORY CLEAR * ;********************************************************************** RSLV,GRSYNC,GRPITCH PUBLIC GRZOOM PUBLIC GRCSRFORM,GRSCROLL,GRCLEAR PUBLIC GRSTART PUBLIC GRTEXTW,GRWRITE,GRVECT SAR AX,CL 0033 8B0E0000 E MOV CX,Y_MAX 0037 2BCA SUB CX,DX 0039 50 PUSH AX 003A B84000 MOV AX,PITCH 003D F7E1 MU GRCLEAR: 0065 32C0 Xor AL,AL ;get a zero 0067 A21F00 R Mov GRCOLR,AL ;set the color to green 006A A21300 R MOV GRZOOMP,AL ;set zoom to 0 006D E8F900 W PUBLIC GRVECTE,GRMASK,GRTEXTE PUBLIC GRCSRO,GRGDCC1,GRGDCC PUBLIC DDINIT PUBLIC GRFXON,GRFXOFF L CX 003F 59 POP CX 0040 03C1 ADD AX,CX 0042 03062100 R ADD AX,GRSAD1 CP/M RASM86 0.2 SOURCE: DDNECLIB.A86  0169 CALL GRZOOM ; 0070 B90300 Mov CX,3 ;get a loop count GRCLR010: 0073 51 PUSH CX 0074 49 Dec CX  ; ; ;********************************************************************** ;Initilize 7220 chip DDINIT: 0000 C6061F0000 R  PAGE 2 0046 8BD0 MOV DX,AX 0048 58 POP AX 0049 B104 MOV CL,4 004B D3E0 SHL AX,CL 004D 8AC8 MOV  ;must be 0 relative 0075 33D2 Xor DX,DX ;make a zero 0077 E8AA00 0124 CALL GRCSRW 007A C7061900FFFF R MOV GRMASK_W,0FFFFH 0080 E8B900 013C CALL GRMA Mov GRCOLR,0 ;clear the color variable 0005 E8CF00 00D7 Call GRRESET 0008 E89B01 01A6 Call GRFXON ;turn on the grafix screen 000B B008 Mov AL,08H CL,AL 004F C3 RET ; ; ;********************************************************************** ;* SCROLL COMMAND SK 0083 B90400 MOV CX,4 0086 BB2A00 R MOV BX,OFFSET GRTEXTP1 GRCLR020: 0089 B8FFFF MOV AX,0FFFFH 008C 8907 MOV [BX],AX  000D E646 Out 46H,AL 000F E8D500 00E7 Call GRSLV 0012 E8FA00 010F Call GRSYNC 0015 E85B01 0173 Call GRPITCH 0018 E84E01 0169 Call GRZOOM 001AND PARAMETERS OUTPUT * ;********************************************************************** GRSCROLL: 0050 BB2100 R MOV BX,DASCROLL+1 ; BX = SCROL008E 43 INC BX 008F 43 INC BX 0090 E2F7 0089 LOOP GRCLR020 0092 E8E800 017D CALL GRTEXTW 0095 B90000 MOV CX,0 0098 C6063E00B E84101 015F Call GRCSRFORM 001E E82F00 0050 Call GRSCROLL 0021 E84100 0065 Call GRCLEAR 0024 E8C800 00EF Call GRSTART 0027 C3 Ret L PARAMETERS' AREA 0053 B90400 MOV CX,4 ; CX = NUMBER OF PARAMETERS 0056 E83901 0192 CALL GRGDCC ; GDC STATUS CHECK 0059 B070 MOV AL,SCROLLCMD ; 005B E67220 R MOV GRWRT,GRWRTW ; 009D C606060022 R MOV GRATTRIB,022H ; CP/M RASM86 0.2 SOURCE: DDNECLIB.A86 PAGE 3 00A2 E8A300 014 ; ;********************************************************************** ;* (X,Y) TO SCREEN MEMORY ADDRESS CONVERT * ;* I OUT GRCMD,AL ; SCROLL COMMAND OUTPUT GRSCRO010: 005D 8A07 MOV AL,[BX] ; 005F E670 OUT GRPARA,AL ; SCROLL PARAMETER OUTPUT ; 8 CALL GRWRITE 00A5 C606330010 R MOV GRVECTP1,10H 00AA C70634003F00 R MOV GRVECTP2,63 00B0 C70636000004 R MOV GRVECTP4,1024 00B6 B90500 MOV CX,5 00B9 E8CD00  GRMSTR: 00DF E8BD00 019F CALL GRGDCC1 ; GDC FIFO EMPTY CHECK 00E2 B06F MOV AL,MSTRCMD ; 00E4 E672 OUT GRCMD,AL ; MASTER COMMAND O OUT GRCMD,AL ; TEXT EXECUTE 010E C3 RET ;********************************************************************** GRSYNC: 010F B90800  0189 CALL GRVECTW 00BC E84800 0107 CALL GRTEXTE 00BF 59 POP CX 00C0 E2B1 0073 LOOP GRCLR010 ; 00C2 C3 RET UTPUT 00E6 C3 RET ;********************************************************************** GRSLV: 00E7 E8B500 019F CALL GRGDCC1 ; GDC FIFO EMPTY CH MOV CX,8 0112 BB0700 R MOV BX,DASYNC 0115 E8ABFF 00C3 CALL GRMOUT ; 0118 C3 RET ;************************************************************ ; ;********************************************************************** ;* MULTI COMMAND OUTPUT ROUTINE * ;* INPUT BECK 00EA B06E MOV AL,SLVCMD ; 00EC E672 OUT GRCMD,AL ; SLAVE COMMAND OUTPUT 00EE C3 RET ;**************************************************** GRCSRO: 0119 8B0E0000 R MOV CX,XAD ; 011D 8B160200 R MOV DX,YAD ; 0121 E804FF 0028 CALL GRXYCV ; GRCSRW: X = ADDRESS OF COMMAND AND PARAMETERS * ;* CX = NUMBER OF PARAMETERS * ;********************************************************************** **************************** GRSTART: 00EF E8AD00 019F CALL GRGDCC1 ; GDC FIFO EMPTY CHECK 00F2 B06B MOV AL,STARTCMD ; 00F4 E672 OUT GRCM 0124 53 PUSH BX 0125 89161C00 R MOV GREAD,DX ; 0129 0A0E1F00 R OR CL,GRCOLR 012D 880E1E00 R MOV GRDAD,CL ; 0131 B90300  GRMOUT: 00C3 E8D900 019F CALL GRGDCC1 ; GDC STATUS CHECK 00C6 8A07 MOV AL,[BX] ; 00C8 E672 OUT GRCMD,AL ; COMMAND OUTPUT 00CA 83F900 D,AL ; DISPLAY ENABLE CP/M RASM86 0.2 SOURCE: DDNECLIB.A86 PAGE 4 00F6 C3 RET ;************************************MOV CX,3 0134 BB1B00 R MOV BX,DACSRW ; 0137 E889FF 00C3 CALL GRMOUT 013A 5B POP BX 013B C3 RET ;******************* CMP CX,0 ; IF NO PARAMETER 00CD 7407 00D6 JE GRMOUTRET ; GRMOUT010: 00CF 43 INC BX ; 00D0 8A07 ********************************** GRSTOP: 00F7 E8A500 019F CALL GRGDCC1 ; GDC FIFO EMPTY CHECK 00FA B00C MOV AL,STOPCMD ; 00FC E672 OUT *************************************************** GRMASK: 013C 53 PUSH BX 013D B90200 MOV CX,2 ; 0140 BB1800 R MOV BX,DAMASK ; MOV AL,[BX] ; 00D2 E670 OUT GRPARA,AL ; PARAMETER OUTPUT 00D4 E2F9 00CF LOOP GRMOUT010 ; GRMOUTRET: 00D6 C3 RET GRCMD,AL ; DISPLAY DISABLE 00FE C3 RET ;********************************************************************** GRVECTE: 00FF E89D00 019F CALL GRGDC 0143 E87DFF 00C3 CALL GRMOUT 0146 5B POP BX 0147 C3 RET ;**********************************************************************  ; RETURN ;********************************************************************** GRRESET: 00D7 E8C500 019F CALL GRGDCC1 ; GDC FIFO EMPTY CHECK 00DA B000 C1 ; GDC FIFO EMPTY CHECK 0102 B06C MOV AL,VECTECMD ; 0104 E672 OUT GRCMD,AL ; VECTOR EXECUTE 0106 C3 RET ;****************** GRWRITE: 0148 53 PUSH BX 0149 A00600 R MOV AL,GRATTRIB ; CP/M RASM86 0.2 SOURCE: DDNECLIB.A86 PAGE 5 014C 2403  MOV AL,RESETCMD ; 00DC E672 OUT GRCMD,AL ; RESET COMMAND OUTPUT 00DE C3 RET ;************************************************************************************************************************** GRTEXTE: 0107 E89500 019F CALL GRGDCC1 ; GDC FIFO EMPTY CHECK 010A B068 MOV AL,TEXTECMD ; 010C E672 <  AND AL,03H ; 014E 80263E00FC R And GRWRT,0FCH ; mask out any old mode bits 0153 08063E00 R Or GRWRT,AL ; 0157 BB3E00 R MOV BX,DAWRI RET ; ;********************************************************************** ;* GDC STATUS CHECK ROUTINES *  DSEG ; ; EXTRN Y_MAX:WORD,X_MAX:WORD ; PUBLIC GRTEXTP1,GRTEXTP2,GRATTRIB TE ; 015A E866FF 00C3 CALL GRMOUT ; 015D 5B POP BX 015E C3 RET ;*********************************************************************  ;********************************************************************** GRGDCC: 0192 E470 IN AL,GRSTATUS ; GDC STATUS READ 0194 A808 TEST AL,0 PUBLIC GRTEXTP_W PUBLIC GRVECTP1,GRVECTP2,GRVECTP4,GRVECTDC,GRVECTD PUBLIC GRVECTD2 PUBLIC GRVECTD1,GRVECTDM  GRCSRFORM: 015F B90300 MOV CX,3 ; NUMBER OF PARAMETERS 0162 BB1400 R MOV BX,DACSRFORM ; 0165 E85BFF 00C3 CALL GRMOUT 0168 C3 8H ; DRAWING (DB3) 0196 75FA 0192 JNZ GRGDCC ; IF NOT READY 0198 F6D0 NOT AL ; VERTICAL SYNC (DB5) 019A A824 TEST AL,24H ; FIFO E PUBLIC GRATTRIB PUBLIC XAD,YAD PUBLIC GRCOLR PUBLIC GRWRT,GRWRTP PUBLIC GRMASK_L  RET ;********************************************************************** GRZOOM: 0169 B90100 MOV CX,1 ; 016C BB1200 R MOV BX,DAMPTY (DB2) 019C 75F4 0192 JNZ GRGDCC ; IF NOT READY 019E C3 RET ; RETURN IF GDC IS READY CP/M RASM86 0.2 SOURCE: DDNECLIB.A86  PUBLIC GRMASK_W ; PUBLIC GRWRTW PUBLIC GRZOOMP ; 0000 0000 XAD DW 0 ; 0002 ZOOM ; 016F E851FF 00C3 CALL GRMOUT ; 0172 C3 RET ;********************************************************************** GRPITCH: 0173 B PAGE 6 ; GRGDCC1: 019F E470 IN AL,GRSTATUS ; GDC STATUS READ 01A1 A804 TEST AL,04H ; FIFO EMPTY (DB0000 YAD DW 0 ; 0004 01 X_SKIP DB 1 ; 0005 01 Y_SKIP DB 1 ; 0006 80 GRATTRIB DB 80H ; 90100 MOV CX,1 ; 0176 BB1000 R MOV BX,DAPITCH ; 0179 E847FF 00C3 CALL GRMOUT ; 017C C3 RET ;**************2) 01A3 74FA 019F JZ GRGDCC1 ; IF NOT EMPTY 01A5 C3 RET ; RETURN IF GDC FIFO IS EMPTY ;************************************************************** ; 0007 DASYNC EQU OFFSET $ 0007 00 DB 00H ; 0008 16 DB 16H ;16 flashless mode/ 06 flash mode 0009 26 ******************************************************** GRTEXTW: 017D 53 PUSH BX 017E B90800 MOV CX,8 ; 0181 BB2900 R MOV BX,DATEXTW ******* GRFXON: 01A6 B001 Mov AL,1 01A8 E676 Out 76H,AL 01AA C3 Ret GRFXOFF: 01AB B000 Mov  DB 26H ; 000A 46 DB 46H ; CP/M RASM86 0.2 SOURCE: DDNECLIB.A86 PAGE 7 000B 0E  ; 0184 E83CFF 00C3 CALL GRMOUT ; 0187 5B POP BX 0188 C3 RET ;**********************************************************************  AL,0 01AD E676 Out 76H,AL 01AF C3 Ret ; ; ; ;******************************************** DB 0EH ; 000C 03 DB 03H ; 000D 13 DB 13H ; 000E DB DB 0DBH ; 000F 91 DB 91H GRVECTW: 0189 53 PUSH BX 018A BB3200 R MOV BX,DAVECTW ; 018D E833FF 00C3 CALL GRMOUT ; 0190 5B POP BX 0191 C3 ************************** ;* GRAPHIC DISPLAY DATA AREA * ;********************************************************************** <  ; ; 0010 DAPITCH EQU OFFSET $ 0010 47 DB 47H ; 0011 40 DB PITCH ; ; 0012  00H ; 0030 00 GRTEXTP7 DB 00H ; 0031 00 GRTEXTP8 DB 00H ; 002A GRTEXTP_W EQU word ptr GRTEXTP1 ; 0032  CSRRCMD EQU 0E0H ; ; 0040 PITCH EQU 40H ; 0072 GRCMD EQU 72H ; 0070 GRPARA EQU 70H ; 00 DAZOOM EQU OFFSET $ 0012 46 DB 46H ; 0013 00 GRZOOMP DB 00H ; ; 0014 DACSRFORM EQU OFF DAVECTW EQU OFFSET $ CP/M RASM86 0.2 SOURCE: DDNECLIB.A86 PAGE 8 0032 4C DB 4CH ; 0033 00 GRVECT70 GRSTATUS EQU 70H ; 0072 GRRDATA EQU 72H ; ; ; END END OF ASSEMBLY. NUMBER OF ERSET $ 0014 4B DB 4BH ; 0015 00 DB 00H ; 0016 40 DB 40H ; 0017 00 DB 00H ; P1 DB 00H ; GRVECTDC: 0034 0000 GRVECTP2 DW 0000H ; GRVECTD: 0036 0000 GRVECTP4 DW 0000H ; GRVECTRORS: 0. USE FACTOR: 12% 0H ; ; 0040 PITCH EQU 40H ;  ; 0018 DAMASK EQU OFFSET $ 0018 4A DB 4AH ; 0019 FF GRMASK_L DB 0FFH ; 001A FF GRMASK_H DB 0FD2: 0038 0000 GRVECTP6 DW 0000H ; GRVECTD1: 003A 0000 GRVECTP8 DW 0000H ; GRVECTDM: 003C 0000 GRVECTP10 DW 0000HFH ; 0019 GRMASK_W EQU word ptr GRMASK_L ; 001B DACSRW EQU OFFSET $ 001B 49 DB 49H ; 001C 0000 GREA ; ; 003E DAWRITE EQU OFFSET $ 003E 00 GRWRT DB 00H ; 003F 00 GRWRTP1 DB 00H ; 0040 00 GRWRTP2 D DW 0000H ; 001E 00 GRDAD DB 00H ; 001F 01 GRCOLR DB 01H ; 0020 DASCROLL EQU OFFSET $ 0020 70  DB 00H ; 003F GRWRTP EQU word ptr GRWRTP1 ; ; 0000 RESETCMD EQU 00H ; 006B STARTCMD EQU  DB 70H ; 0021 0000 GRSAD1 DW 0000H ; 0023 B01D GRSL1 DW 1DB0H ; 0025 0000 GRSAD2 DW 0000H ; 0027 0000 GRSL2  6BH ; 000C STOPCMD EQU 0CH ; 006F MSTRCMD EQU 6FH ; 006E SLVCMD EQU 6EH ; 006C VECTECMD EQU 6CH ; DW 0000H ; ; 0029 DATEXTW EQU OFFSET $ 0029 78 DB 78H ; 002A 00 GRTEXTP1 DB 00H 002B 00  0068 TEXTECMD EQU 68H ; 0070 SCROLLCMD EQU 70H ; 0020 GRWRTW EQU 20H ; 0030 GRWRTL EQU 30H ; 0038  GRTEXTP2 DB 00H 002C 00 GRTEXTP3 DB 00H 002D 00 GRTEXTP4 DB 00H ; 002E 00 GRTEXTP5 DB 00H ; 002F 00 GRTEXTP6 DB  GRWRTH EQU 38H ; 00A0 GRREADW EQU 0A0H ; 00B0 GRREADL EQU 0B0H ; 00B8 GRREADH EQU 0B8H ; 00E0 =  CP/M RASM86 0.2 SOURCE: NECASCII.A86 PAGE 1 ;CHARACTER BIT TABLE IN ASCII SEQUENCE ; DGROUP GRO0001000B 0024 10 DB 00010000B 0025 20 DB 00100000B 0026 40 DB 01000000B 0027 80 DB 10000000B CP/M RASM86 0.2 SOURCE: NECASCII DB 0FFH 004F FF DB 0FFH 0050 FF DB 0FFH 0051 FF DB 0FFH 0052 FF DB 0FFH 0053 FF UP DATA DSEG ; PUBLIC CHARACTER_BIT_TABLE ; 0000 FF CHARACTER_BIT_TABLE DB 0FFH 0001 FF .A86 PAGE 2 0028 08 DB 00001000B 0029 08 DB 00001000B 002A 08 DB 00001000B 002B DB 0FFH 0054 FF DB 0FFH 0055 FF DB 0FFH CP/M RASM86 0.2 SOURCE: NECASCII.A86 PAGE 3 0056 FF  DB 0FFH 0002 FF DB 0FFH 0003 FF DB 0FFH 0004 FF DB 0FFH 0005 FF DB 0FFH 0006 FF DB 0F 08 DB 00001000B 002C FF DB 11111111B 002D 08 DB 00001000B 002E 08 DB 00001000B 002F 08 DB 0000100 DB 0FFH 0057 FF DB 0FFH 0058 FF DB 0FFH 0059 FF DB 0FFH 005A FF DB 0FFH 005B FF FH 0007 FF DB 0FFH 0008 08 DB 00001000B 0009 08 DB 00001000B 000A 08 DB 00001000B 000B 08 DB 0B 0030 80 DB 10000000B 0031 41 DB 01000001B 0032 22 DB 00100010B 0033 14 DB 00010100B 0034 08 DB  DB 0FFH 005C FF DB 0FFH 005D FF DB 0FFH 005E FF DB 0FFH 005F FF DB 0FFH 0060 FF DB 0FFH  00001000B 000C 08 DB 00001000B 000D 08 DB 00001000B 000E 08 DB 00001000B 000F 08 DB 00001000B 0010 00  00001000B 0035 14 DB 00010100B 0036 22 DB 00100010B 0037 41 DB 01000001B 0038 FF DB 0FFH 0039 FF  0061 FF DB 0FFH 0062 FF DB 0FFH 0063 FF DB 0FFH 0064 FF DB 0FFH 0065 FF DB 0FFH 0066 FF  DB 00000000B 0011 00 DB 00000000B 0012 00 DB 00000000B 0013 00 DB 00000000B 0014 FF DB 11111111B 0015 00  DB 0FFH 003A FF DB 0FFH 003B FF DB 0FFH 003C FF DB 0FFH 003D FF DB 0FFH 003E FF DB 0FFH  DB 0FFH 0067 FF DB 0FFH 0068 FF DB 0FFH 0069 FF DB 0FFH 006A FF DB 0FFH 006B FF  DB 00000000B 0016 00 DB 00000000B 0017 00 DB 00000000B 0018 80 DB 10000000B 0019 40 DB 01000000B 001A 20  003F FF DB 0FFH ; 0040 FF DB 0FFH 0041 FF DB 0FFH 0042 FF DB 0FFH 0043 FF D DB 0FFH 006C FF DB 0FFH 006D FF DB 0FFH 006E FF DB 0FFH 006F FF DB 0FFH 0070 FF DB 0 DB 00100000B 001B 10 DB 00010000B 001C 08 DB 00001000B 001D 04 DB 00000100B 001E 02 DB 00000010B B 0FFH 0044 FF DB 0FFH 0045 FF DB 0FFH 0046 FF DB 0FFH 0047 FF DB 0FFH 0048 FF DB 0FFH FFH 0071 FF DB 0FFH 0072 FF DB 0FFH 0073 FF DB 0FFH 0074 FF DB 0FFH 0075 FF DB 0FFH 0076 FF 001F 01 DB 00000001B 0020 01 DB 00000001B 0021 02 DB 00000010B 0022 04 DB 00000100B 0023 08 DB 00049 FF DB 0FFH 004A FF DB 0FFH 004B FF DB 0FFH 004C FF DB 0FFH 004D FF DB 0FFH 004E FF =  DB 0FFH 0077 FF DB 0FFH 0078 FF DB 0FFH 0079 FF DB 0FFH 007A FF DB 0FFH 007B FF  DB 01010100B 009E 92 DB 10010010B 009F 00 DB 00000000B ; 00A0 FE DB 11111110B 00A1 82  DB 0FFH 00C7 FF DB 0FFH 00C8 FF DB 0FFH 00C9 FF DB 0FFH 00CA FF DB 0FFH 00CB FF  DB 0FFH 007C FF DB 0FFH 007D FF DB 0FFH 007E FF DB 0FFH 007F FF DB 0FFH ;  DB 10000010B 00A2 82 DB 10000010B 00A3 82 DB 10000010B 00A4 82 DB 10000010B 00A5 82 DB 10000010B 00A6 FE  DB 0FFH 00CC FF DB 0FFH 00CD FF DB 0FFH 00CE FF DB 0FFH 00CF FF DB 0FFH 00D0 FF DB 0 ;010H 0080 10 DB 00010000B 0081 10 DB 00010000B 0082 10 DB 00010000B 0083 EE DB 11101110B CP/M RASM86 DB 11111110B 00A7 00 DB 00000000B ; 00A8 82 DB 10000010B 00A9 44 DB 01000100B 00AA 28 FFH 00D1 FF DB 0FFH 00D2 FF DB 0FFH 00D3 FF DB 0FFH 00D4 FF DB 0FFH 00D5 FF DB 0FFH 00D6 FF  0.2 SOURCE: NECASCII.A86 PAGE 4 0084 10 DB 00010000B 0085 10 DB 00010000B 0086 10 DB  DB 00101000B 00AB 10 DB 00010000B 00AC 28 DB 00101000B 00AD 44 DB 01000100B 00AE 82 DB 10000010B 00AF 00  DB 0FFH 00D7 FF DB 0FFH 00D8 FF DB 0FFH 00D9 FF DB 0FFH 00DA FF DB 0FFH 00DB FF  00010000B 0087 00 DB 00000000B ; 0088 00 DB 00000000B 0089 00 DB 00000000B 008A 00 DB 00000000B  DB 00000000B ; 00B0 FF DB 0FFH 00B1 FF DB 0FFH CP/M RASM86 0.2 SOURCE: NECASCII.A86  DB 0FFH 00DC FF DB 0FFH 00DD FF DB 0FFH 00DE FF DB 0FFH 00DF FF DB 0FFH 00E0 FF DB 0 008B 10 DB 00010000B 008C 00 DB 00000000B 008D 00 DB 00000000B 008E 00 DB 00000000B 008F 00 DB 00 PAGE 5 00B2 FF DB 0FFH 00B3 FF DB 0FFH 00B4 FF DB 0FFH 00B5 FF DB 0FFH 00B6 FF DB FFH 00E1 FF DB 0FFH 00E2 FF DB 0FFH 00E3 FF DB 0FFH CP/M RASM86 0.2 SOURCE: NECASCII.A86 000000B ; 0090 10 DB 00010000B 0091 10 DB 00010000B 0092 10 DB 00010000B 0093 FE DB 11111110B 0094 0FFH 00B7 FF DB 0FFH ; 00B8 FF DB 0FFH 00B9 FF DB 0FFH 00BA FF DB 0FFH 00BB FF  PAGE 6 00E4 FF DB 0FFH 00E5 FF DB 0FFH 00E6 FF DB 0FFH 00E7 FF DB 0FFH 00E8 FF DB 0FFH 10 DB 00010000B 0095 10 DB 00010000B 0096 10 DB 00010000B 0097 00 DB 00000000B ; 0098 92  DB 0FFH 00BC FF DB 0FFH 00BD FF DB 0FFH 00BE FF DB 0FFH 00BF FF DB 0FFH 00C0 FF DB 0 00E9 FF DB 0FFH 00EA FF DB 0FFH 00EB FF DB 0FFH 00EC FF DB 0FFH 00ED FF DB 0FFH 00EE FF  DB 10010010B 0099 54 DB 01010100B 009A 38 DB 00111000B 009B FE DB 11111110B 009C 38 DB 00111000B 009D 54 FFH 00C1 FF DB 0FFH 00C2 FF DB 0FFH 00C3 FF DB 0FFH 00C4 FF DB 0FFH 00C5 FF DB 0FFH 00C6 FF >  DB 0FFH 00EF FF DB 0FFH 00F0 FF DB 0FFH 00F1 FF DB 0FFH 00F2 FF DB 0FFH 00F3 FF  DB 0AH 011C 1F DB 01FH 011D 0A DB 0AH 011E 0A DB 0AH 011F 00 DB 00H 0120 04 DB 04H  PAGE 8 014B 08 DB 08H 014C 08 DB 08H 014D 04 DB 04H 014E 02 DB 02H 014F 00  DB 0FFH 00F4 FF DB 0FFH 00F5 FF DB 0FFH 00F6 FF DB 0FFH 00F7 FF DB 0FFH 00F8 FF DB 0FFH 0121 1E DB 01EH 0122 05 DB 05H 0123 0E DB 0EH 0124 14 DB 014H 0125 0F DB 0FH 0126 04  DB 00H 0150 00 DB 00H 0151 04 DB 04H 0152 15 DB 015H 0153 0E DB 0EH 0154 15  00F9 FF DB 0FFH 00FA FF DB 0FFH 00FB FF DB 0FFH 00FC FF DB 0FFH 00FD FF DB 0FFH 00FE FF  DB 04H 0127 00 DB 00H 0128 03 DB 03H 0129 13 DB 013H 012A 08 DB 08H 012B 04 DB  DB 015H 0155 04 DB 04H 0156 00 DB 00H 0157 00 DB 00H 0158 00 DB 00H 0159 04 DB 04H 015 DB 0FFH 00FF FF DB 0FFH ;; 0100 00 DB 00H 0101 00 DB 00H 0102 00 DB 00H 010 04H 012C 02 DB 02H 012D 19 DB 019H 012E 18 DB 018H 012F 00 DB 00H 0130 04 DB 04H 0131 0A A 04 DB 04H 015B 1F DB 01FH 015C 04 DB 04H 015D 04 DB 04H 015E 00 DB 00H 015F 00 3 00 DB 00H 0104 00 DB 00H 0105 00 DB 00H 0106 00 DB 00H 0107 00 DB 00H 0108 04  DB 0AH 0132 0A DB 0AH 0133 06 DB 06H 0134 15 DB 015H 0135 09 DB 09H 0136 16  DB 00H 0160 00 DB 00H 0161 00 DB 00H 0162 00 DB 00H 0163 00 DB 00H 0164 00 DB 00H DB 04H 0109 04 DB 04H 010A 04 DB 04H 010B 04 DB 04H 010C 04 DB 04H 010D 00 DB 00H  DB 016H 0137 00 DB 00H 0138 10 DB 010H 0139 08 DB 08H 013A 04 DB 04H 013B 00 DB 00H 013 0165 01 DB 01H 0166 01 DB 01H 0167 80 DB 080H 0168 00 DB 00H 0169 00 DB 00H 016A 00  010E 04 DB 04H 010F 00 DB 00H 0110 12 DB 012H 0111 12 DB 012H 0112 12 DB 012H 0113 00 C 00 DB 00H 013D 00 DB 00H 013E 00 DB 00H 013F 00 DB 00H 0140 04 DB 04H 0141 02  DB 00H 016B 1F DB 01FH 016C 00 DB 00H 016D 00 DB 00H 016E 00 DB 00H 016F 00 DB  DB 00H 0114 00 DB 00H 0115 00 DB 00H 0116 00 DB 00H CP/M RASM86 0.2 SOURCE: NECASCII.A86  DB 02H 0142 01 DB 01H 0143 01 DB 01H 0144 01 DB 01H 0145 02 DB 02H 0146 04 DB 04H  00H 0170 00 DB 00H 0171 00 DB 00H 0172 00 DB 00H 0173 00 DB 00H 0174 00 DB 00H 0175 01  PAGE 7 0117 00 DB 00H 0118 0A DB 0AH 0119 0A DB 0AH 011A 1F DB 01FH 011B 0A  0147 00 DB 00H 0148 02 DB 02H 0149 04 DB 04H 014A 08 DB 08H CP/M RASM86 0.2 SOURCE: NECASCII.A86 >  DB 01H 0176 00 DB 00H 0177 00 DB 00H 0178 00 DB 00H 0179 10 DB 010H 017A 08  DB 09H 01A4 1F DB 01FH 01A5 08 DB 08H 01A6 08 DB 08H 01A7 00 DB 00H 01A8 1F DB  DB 06H 01D2 00 DB 00H 01D3 00 DB 00H 01D4 00 DB 00H 01D5 06 DB 06H 01D6 06 DB  DB 08H 017B 04 DB 04H 017C 02 DB 02H 017D 01 DB 01H 017E 00 DB 00H CP/M RASM86 0.2 SOURCE: NECASCII.A86  01FH 01A9 01 DB 01H 01AA 0F DB 0FH 01AB 10 DB 010H 01AC 10 DB 010H 01AD 11 DB 011H 01AE 0E 06H 01D7 00 DB 00H 01D8 00 DB 00H 01D9 00 DB 00H 01DA 04 DB 04H 01DB 00 DB 00H 01DC 04  PAGE 9 017F 00 DB 00H 0180 0E DB 0EH 0181 11 DB 011H 0182 19 DB 0 DB 0EH 01AF 00 DB 00H 01B0 0C DB 0CH 01B1 02 DB 02H 01B2 01 DB 01H CP/M RASM86 0.2 SOURCE: NEC DB 04H 01DD 04 DB 04H 01DE 02 DB 02H 01DF 00 DB 00H 01E0 08 DB 08H 01E1 04 D19H 0183 15 DB 015H 0184 13 DB 013H 0185 11 DB 011H 0186 0E DB 0EH 0187 00 DB 00H 0188 04 ASCII.A86 PAGE 10 01B3 0F DB 0FH 01B4 11 DB 011H 01B5 11 DB 011H 01B6 0E B 04H 01E2 02 DB 02H 01E3 01 DB 01H 01E4 02 DB 02H 01E5 04 DB 04H 01E6 08 DB 08H CP/M RAS DB 04H 0189 06 DB 06H 018A 04 DB 04H 018B 04 DB 04H 018C 04 DB 04H 018D 04  DB 0EH 01B7 00 DB 00H 01B8 1F DB 01FH 01B9 10 DB 010H 01BA 08 DB 08H 01BB 04 DB M86 0.2 SOURCE: NECASCII.A86 PAGE 11 01E7 00 DB 00H 01E8 00 DB 00H 01E9 00 DB 00H DB 04H 018E 0E DB 0EH 018F 00 DB 00H 0190 0E DB 0EH 0191 11 DB 011H 0192 10 DB 010H 0193  04H 01BC 02 DB 02H 01BD 02 DB 02H 01BE 02 DB 02H 01BF 00 DB 00H 01C0 0E DB 0EH 01C1 11  01EA 1F DB 01FH 01EB 00 DB 00H 01EC 1F DB 01FH 01ED 00 DB 00H 01EE 00 DB 00H 01EF 00 08 DB 08H 0194 04 DB 04H 0195 02 DB 02H 0196 1F DB 01FH 0197 00 DB 00H 0198 1F  DB 011H 01C2 11 DB 011H 01C3 0E DB 0EH 01C4 11 DB 011H 01C5 11 DB 011H 01C6 0E  DB 00H 01F0 02 DB 02H 01F1 04 DB 04H 01F2 08 DB 08H 01F3 10 DB 010H 01F4 08 DB  DB 01FH 0199 08 DB 08H 019A 04 DB 04H 019B 08 DB 08H 019C 10 DB 010H 019D 11 DB 011 DB 0EH 01C7 00 DB 00H 01C8 0E DB 0EH 01C9 11 DB 011H 01CA 11 DB 011H 01CB 1E DB 01EH  08H 01F5 04 DB 04H 01F6 02 DB 02H 01F7 00 DB 00H 01F8 0E DB 0EH 01F9 11 DB 011H 01FA 10 H 019E 0E DB 0EH 019F 00 DB 00H 01A0 08 DB 08H 01A1 0C DB 0CH 01A2 0A DB 0AH 01A3 09  01CC 10 DB 010H 01CD 08 DB 08H 01CE 06 DB 06H 01CF 00 DB 00H 01D0 06 DB 06H 01D1 06 ?  DB 010H 01FB 08 DB 08H 01FC 04 DB 04H 01FD 04 DB 04H 01FE 04 DB 04H 01FF 00  DB 01FH 0229 01 DB 01H 022A 01 DB 01H 022B 0F DB 0FH 022C 01 DB 01H 022D 01  DB 06H 0257 00 DB 00H 0258 11 DB 011H 0259 09 DB 09H 025A 05 DB 05H 025B 07  DB 00H 0200 0E DB 0EH 0201 11 DB 011H 0202 1D DB 01DH 0203 15 DB 015H 0204 1D DB 01DH 0 DB 01H 022E 1F DB 01FH 022F 00 DB 00H 0230 1F DB 01FH 0231 01 DB 01H 0232 01 DB 01H  DB 07H 025C 09 DB 09H 025D 11 DB 011H 025E 11 DB 011H 025F 00 DB 00H 0260 01 DB 01H 026205 01 DB 01H 0206 0E DB 0EH 0207 00 DB 00H 0208 04 DB 04H 0209 0A DB 0AH 020A 11 0233 0F DB 0FH 0234 01 DB 01H 0235 01 DB 01H 0236 01 DB 01H 0237 00 DB 00H 0238 0E 1 01 DB 01H 0262 01 DB 01H 0263 01 DB 01H 0264 01 DB 01H 0265 01 DB 01H 0266 1F  DB 011H 020B 1F DB 01FH 020C 11 DB 011H 020D 11 DB 011H 020E 11 DB 011H 020F 00 DB  DB 0EH 0239 11 DB 011H 023A 01 DB 01H 023B 01 DB 01H 023C 19 DB 019H 023D 11 DB  DB 01FH 0267 00 DB 00H 0268 11 DB 011H 0269 1B DB 01BH 026A 15 DB 015H 026B 11 DB  00H 0210 0F DB 0FH 0211 11 DB 011H 0212 11 DB 011H 0213 0F DB 0FH 0214 11 DB 011H 0215 11  011H 023E 1E DB 01EH 023F 00 DB 00H 0240 11 DB 011H 0241 11 DB 011H 0242 11 DB 011H 0243 1F 011H 026C 11 DB 011H 026D 11 DB 011H 026E 11 DB 011H 026F 00 DB 00H 0270 11 DB 011H 0271 13  DB 011H 0216 0F DB 0FH 0217 00 DB 00H 0218 0E DB 0EH 0219 11 DB 011H 021A 01  DB 01FH 0244 11 DB 011H 0245 11 DB 011H 0246 11 DB 011H 0247 00 DB 00H 0248 0E  DB 013H 0272 15 DB 015H 0273 19 DB 019H 0274 11 DB 011H 0275 11 DB 011H 0276 11  DB 01H CP/M RASM86 0.2 SOURCE: NECASCII.A86 PAGE 12 021B 01 DB 01H 021C 01 DB 01H 021D 11  DB 0EH 0249 04 DB 04H 024A 04 DB 04H 024B 04 DB 04H 024C 04 DB 04H 024D 04 DB 04H  DB 011H 0277 00 DB 00H 0278 0E DB 0EH 0279 11 DB 011H 027A 11 DB 011H 027B 11 DB 011 DB 011H 021E 0E DB 0EH 021F 00 DB 00H 0220 0F DB 0FH 0221 11 DB 011H 0222 11 DB 024E 0E DB 0EH CP/M RASM86 0.2 SOURCE: NECASCII.A86 PAGE 13 024F 00 DB 00H 0250 1C DB H 027C 11 DB 011H 027D 11 DB 011H 027E 0E DB 0EH 027F 00 DB 00H 0280 0E DB 0EH 0281 11  011H 0223 11 DB 011H 0224 11 DB 011H 0225 11 DB 011H 0226 0F DB 0FH 0227 00 DB 00H 0228 1F  01CH 0251 08 DB 08H 0252 08 DB 08H 0253 08 DB 08H 0254 08 DB 08H 0255 09 DB 09H 0256 06 ?  DB 011H 0282 11 DB 011H CP/M RASM86 0.2 SOURCE: NECASCII.A86 PAGE 14 0283 0F DB 0FH 0284 DB 00H 02B0 11 DB 011H 02B1 11 DB 011H 02B2 11 DB 011H 02B3 11 DB 011H 02B4 11  DB 02H 02DE 0E DB 0EH 02DF 00 DB 00H 02E0 00 DB 00H 02E1 01 DB 01H 02E2 02  01 DB 01H 0285 01 DB 01H 0286 01 DB 01H 0287 00 DB 00H 0288 0E DB 0EH 0289 11  DB 011H 02B5 0A DB 0AH 02B6 04 DB 04H CP/M RASM86 0.2 SOURCE: NECASCII.A86 PAGE 15 02B7 00  DB 02H 02E3 04 DB 04H 02E4 08 DB 08H 02E5 10 DB 010H 02E6 00 DB 00H 02E7 00 DB 00H 02E8 DB 011H 028A 11 DB 011H 028B 11 DB 011H 028C 11 DB 011H 028D 15 DB 015H 028E 0E DB  DB 00H 02B8 11 DB 011H 02B9 11 DB 011H 02BA 11 DB 011H 02BB 11 DB 011H 02BC 15 DB  0E DB 0EH 02E9 08 DB 08H 02EA 08 DB 08H CP/M RASM86 0.2 SOURCE: NECASCII.A86 PAGE 16 0EH 028F 10 DB 010H 0290 0E DB 0EH 0291 11 DB 011H 0292 11 DB 011H 0293 0F DB 0FH 0294 09  015H 02BD 15 DB 015H 02BE 0A DB 0AH 02BF 00 DB 00H 02C0 11 DB 011H 02C1 11 DB 011H 02C2 0 02EB 08 DB 08H 02EC 08 DB 08H 02ED 08 DB 08H 02EE 0E DB 0EH 02EF 00 DB 00H 02F0 04  DB 09H 0295 11 DB 011H 0296 11 DB 011H 0297 00 DB 00H 0298 0E DB 0EH 0299 11 A DB 0AH 02C3 04 DB 04H 02C4 0A DB 0AH 02C5 11 DB 011H 02C6 11 DB 011H 02C7 00  DB 04H 02F1 0A DB 0AH 02F2 11 DB 011H 02F3 00 DB 00H 02F4 00 DB 00H 02F5 00 DB  DB 011H 029A 01 DB 01H 029B 06 DB 06H 029C 08 DB 08H 029D 11 DB 011H 029E 0E DB 0EH 029 DB 00H 02C8 11 DB 011H 02C9 11 DB 011H 02CA 0A DB 0AH 02CB 04 DB 04H 02CC 04 DB 04H 00H 02F6 00 DB 00H 02F7 00 DB 00H 02F8 00 DB 00H 02F9 00 DB 00H 02FA 00 DB 00H 02FB 00 F 00 DB 00H 02A0 1F DB 01FH 02A1 04 DB 04H 02A2 04 DB 04H 02A3 04 DB 04H 02A4 04  02CD 04 DB 04H 02CE 04 DB 04H 02CF 00 DB 00H 02D0 1F DB 01FH 02D1 10 DB 010H 02D2 08  DB 00H 02FC 11 DB 011H 02FD 0A DB 0AH 02FE 04 DB 04H 02FF 00 DB 00H 0300 02  DB 04H 02A5 04 DB 04H 02A6 04 DB 04H 02A7 00 DB 00H 02A8 11 DB 011H 02A9 11 DB 01 DB 08H 02D3 04 DB 04H 02D4 02 DB 02H 02D5 01 DB 01H 02D6 1F DB 01FH 02D7 00 DB  DB 02H 0301 04 DB 04H 0302 00 DB 00H 0303 00 DB 00H 0304 00 DB 00H 0305 00 DB 00H 03061H 02AA 11 DB 011H 02AB 11 DB 011H 02AC 11 DB 011H 02AD 11 DB 011H 02AE 0E DB 0EH 02AF 00  00H 02D8 0E DB 0EH 02D9 02 DB 02H 02DA 02 DB 02H 02DB 02 DB 02H 02DC 02 DB 02H 02DD 02 @  00 DB 00H 0307 00 DB 00H 0308 00 DB 00H 0309 00 DB 00H 030A 0E DB 0EH 030B 10 04 DB 04H 0335 04 DB 04H 0336 04 DB 04H 0337 00 DB 00H 0338 00 DB 00H 0339 0E  DB 04H 0363 04 DB 04H 0364 04 DB 04H 0365 04 DB 04H 0366 0E DB 0EH 0367 00  DB 010H 030C 1E DB 01EH 030D 11 DB 011H 030E 1E DB 01EH 030F 00 DB 00H 0310 01 DB 0 DB 0EH 033A 11 DB 011H 033B 11 DB 011H 033C 1E DB 01EH 033D 10 DB 010H 033E 10 DB 01 DB 00H 0368 00 DB 00H 0369 00 DB 00H 036A 01 DB 01H 036B 0B DB 0BH 036C 15 DB 015H 0361H 0311 01 DB 01H 0312 0F DB 0FH 0313 11 DB 011H 0314 11 DB 011H 0315 11 DB 011H 0316 0E 0H 033F 1E DB 01EH 0340 01 DB 01H 0341 01 DB 01H 0342 01 DB 01H 0343 0F DB 0FH 0344 11 D 15 DB 015H 036E 15 DB 015H 036F 00 DB 00H 0370 00 DB 00H 0371 00 DB 00H 0372 01  DB 0EH 0317 00 DB 00H 0318 00 DB 00H 0319 00 DB 00H 031A 0E DB 0EH 031B 01 D DB 011H 0345 11 DB 011H 0346 11 DB 011H 0347 00 DB 00H 0348 04 DB 04H 0349 00  DB 01H 0373 0F DB 0FH 0374 11 DB 011H 0375 11 DB 011H 0376 11 DB 011H 0377 00 DB B 01H 031C 01 DB 01H 031D 01 DB 01H 031E 0E DB 0EH CP/M RASM86 0.2 SOURCE: NECASCII.A86 DB 00H 034A 06 DB 06H 034B 04 DB 04H 034C 04 DB 04H 034D 04 DB 04H 034E 0E DB 0EH 034F 00 00H 0378 00 DB 00H 0379 00 DB 00H 037A 0E DB 0EH 037B 11 DB 011H 037C 11 DB 011H 037D 11  PAGE 17 031F 00 DB 00H 0320 10 DB 010H 0321 10 DB 010H 0322 1E DB 01EH 0323 11 DB 01 DB 00H 0350 10 DB 010H 0351 00 DB 00H 0352 10 DB 010H CP/M RASM86 0.2 SOURCE: NECASCII.A86  DB 011H 037E 0E DB 0EH 037F 00 DB 00H 0380 00 DB 00H 0381 0F DB 0FH 0382 11 1H 0324 11 DB 011H 0325 11 DB 011H 0326 0E DB 0EH 0327 00 DB 00H 0328 00 DB 00H 0329 00  PAGE 18 0353 10 DB 010H 0354 10 DB 010H 0355 11 DB 011H 0356 0E DB 0EH 0357 00  DB 011H 0383 11 DB 011H 0384 0F DB 0FH 0385 01 DB 01H 0386 01 DB 01H CP/M RASM86 0.2 SOURCE: NECASCII.A86  DB 00H 032A 0E DB 0EH 032B 11 DB 011H 032C 1F DB 01FH 032D 01 DB 01H 032E 0E  DB 00H 0358 01 DB 01H 0359 01 DB 01H 035A 09 DB 09H 035B 05 DB 05H 035C 03 DB PAGE 19 0387 01 DB 01H 0388 00 DB 00H 0389 1E DB 01EH 038A 11 DB DB 0EH 032F 00 DB 00H 0330 18 DB 018H 0331 04 DB 04H 0332 04 DB 04H 0333 1F DB 01FH 0334  03H 035D 05 DB 05H 035E 09 DB 09H 035F 00 DB 00H 0360 06 DB 06H 0361 04 DB 04H 0362 04 @ 011H 038B 11 DB 011H 038C 1E DB 01EH 038D 10 DB 010H 038E 10 DB 010H 038F 10 DB 010H 0390 00 : NECASCII.A86 PAGE 20 03BB 11 DB 011H 03BC 15 DB 015H 03BD 15 DB 015H 03BE 0A  DB 04H 03EA 04 DB 04H 03EB 08 DB 08H 03EC 04 DB 04H 03ED 04 DB 04H 03EE 03 DB 03H  DB 00H 0391 00 DB 00H 0392 19 DB 019H 0393 05 DB 05H 0394 03 DB 03H 0395 01  DB 0AH 03BF 00 DB 00H 03C0 00 DB 00H 03C1 00 DB 00H 03C2 11 DB 011H 03C3 0A CP/M RASM86 0.2 SOURCE: NECASCII.A86 PAGE 21 03EF 00 DB 00H 03F0 00 DB 00H 03F1 00 DB  DB 01H 0396 01 DB 01H 0397 00 DB 00H 0398 00 DB 00H 0399 00 DB 00H 039A 1E DB 01EH 03 DB 0AH 03C4 04 DB 04H 03C5 0A DB 0AH 03C6 11 DB 011H 03C7 00 DB 00H 03C8 00 DB 00H 03C9 00H 03F2 10 DB 010H 03F3 1F DB 01FH 03F4 01 DB 01H 03F5 00 DB 00H 03F6 00 DB 00H 03F7 00 9B 01 DB 01H 039C 0E DB 0EH 039D 10 DB 010H 039E 0F DB 0FH 039F 00 DB 00H 03A0 04  00 DB 00H 03CA 11 DB 011H 03CB 11 DB 011H 03CC 1E DB 01EH 03CD 10 DB 010H 03CE 10  DB 00H 03F8 00 DB 00H 03F9 00 DB 00H 03FA 00 DB 00H 03FB 00 DB 00H 03FC 00  DB 04H 03A1 04 DB 04H 03A2 1F DB 01FH 03A3 04 DB 04H 03A4 04 DB 04H 03A5 04 DB 0 DB 010H 03CF 1E DB 01EH 03D0 00 DB 00H 03D1 00 DB 00H 03D2 1F DB 01FH 03D3 08 DB  DB 00H 03FD 00 DB 00H 03FE 00 DB 00H 03FF 00 DB 00H 0400 00 DB 00H 0401 00 DB 00H 0402 4H 03A6 18 DB 018H 03A7 00 DB 00H 03A8 00 DB 00H 03A9 00 DB 00H 03AA 11 DB 011H 03AB 11  08H 03D4 04 DB 04H 03D5 02 DB 02H 03D6 1F DB 01FH 03D7 00 DB 00H 03D8 18 DB 018H 03D9 04 00 DB 00H 0403 00 DB 00H 0404 00 DB 00H 0405 00 DB 00H 0406 00 DB 00H 0407 00  DB 011H 03AC 11 DB 011H 03AD 11 DB 011H 03AE 0E DB 0EH 03AF 00 DB 00H 03B0 00  DB 04H 03DA 04 DB 04H 03DB 02 DB 02H 03DC 04 DB 04H 03DD 04 DB 04H 03DE 18  DB 00H 0408 00 DB 00H 0409 00 DB 00H 040A 00 DB 00H 040B 00 DB 00H 040C 00 DB 00H  DB 00H 03B1 00 DB 00H 03B2 11 DB 011H 03B3 11 DB 011H 03B4 11 DB 011H 03B5 0A DB 0AH 03B DB 018H 03DF 00 DB 00H 03E0 00 DB 00H 03E1 00 DB 00H 03E2 04 DB 04H 03E3 04 DB 04H 03E4 040D 00 DB 00H 040E 00 DB 00H 040F 00 DB 00H 0410 00 DB 00H 0411 00 DB 00H 0412 00 6 04 DB 04H 03B7 00 DB 00H 03B8 00 DB 00H 03B9 00 DB 00H 03BA 11 DB 011H CP/M RASM86 0.2 SOURCE04 DB 04H 03E5 04 DB 04H 03E6 00 DB 00H 03E7 00 DB 00H 03E8 03 DB 03H 03E9 04 A  DB 00H 0413 00 DB 00H 0414 00 DB 00H 0415 00 DB 00H 0416 00 DB 00H 0417 00 DB 0 00H 0441 00 DB 00H 0442 00 DB 00H 0443 00 DB 00H 0444 00 DB 00H 0445 00 DB 00H 0446 00  DB 00H 0470 00 DB 00H 0471 00 DB 00H 0472 00 DB 00H 0473 00 DB 00H 0474 00 0H 0418 00 DB 00H 0419 00 DB 00H 041A 00 DB 00H 041B 00 DB 00H 041C 00 DB 00H 041D 00  DB 00H 0447 00 DB 00H 0448 00 DB 00H 0449 00 DB 00H 044A 00 DB 00H 044B 00 D DB 00H 0475 00 DB 00H 0476 00 DB 00H 0477 00 DB 00H 0478 FF DB 0FFH 0479 FF DB 0FFH 047 DB 00H 041E 00 DB 00H 041F 00 DB 00H 0420 00 DB 00H 0421 00 DB 00H 0422 00 DB B 00H 044C 00 DB 00H 044D 00 DB 00H 044E 00 DB 00H 044F 00 DB 00H 0450 00 DB 00H 0451 00 A FF DB 0FFH 047B FF DB 0FFH 047C FF DB 0FFH 047D FF DB 0FFH 047E FF DB 0FFH 047F FF  00H CP/M RASM86 0.2 SOURCE: NECASCII.A86 PAGE 22 0423 00 DB 00H 0424 00 DB 00H 0425 00  DB 00H 0452 00 DB 00H 0453 00 DB 00H 0454 00 DB 00H 0455 00 DB 00H 0456 00  DB 0FFH ; END END OF ASSEMBLY. NUMBER OF ERRORS: 0. USE FACTOR: 0% 8 FF DB 0FFH 0479 FF DB 0FFH 047 DB 00H 0426 00 DB 00H 0427 00 DB 00H 0428 00 DB 00H 0429 00 DB 00H 042A 00 DB 00H 04 DB 00H CP/M RASM86 0.2 SOURCE: NECASCII.A86 PAGE 23 0457 00 DB 00H 0458 00 DB 00H 0459 00 2B 00 DB 00H 042C 00 DB 00H 042D 00 DB 00H 042E 00 DB 00H 042F 00 DB 00H 0430 00  DB 00H 045A 00 DB 00H 045B 00 DB 00H 045C 00 DB 00H 045D 00 DB 00H 045E 00 DB  DB 00H 0431 00 DB 00H 0432 00 DB 00H 0433 00 DB 00H 0434 00 DB 00H 0435 00 DB 00H00H 045F 00 DB 00H 0460 00 DB 00H 0461 00 DB 00H 0462 00 DB 00H 0463 00 DB 00H 0464 00  CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 1 title 'Customized Basic I/O System V1.107:015;A' ;******************* 0436 00 DB 00H 0437 00 DB 00H 0438 00 DB 00H 0439 00 DB 00H 043A 00 DB 00H 043B 00  DB 00H 0465 00 DB 00H 0466 00 DB 00H 0467 00 DB 00H 0468 00 DB 00H 0469 00 DB ************************** ;* * ;* This Customized BIOS adapts CP/M-86 to * ;* the following hardware configuration *  DB 00H 043C 00 DB 00H 043D 00 DB 00H 043E 00 DB 00H 043F 00 DB 00H 0440 00 DB  00H 046A 00 DB 00H 046B 00 DB 00H 046C 00 DB 00H 046D 00 DB 00H 046E 00 DB 00H 046F 00 A  ;* Processor: 8086 * ;* Brand: * ;* Controller: * ;* ------------------------------------------- ENDIF ;not loader_bios IF loader_bios ;--------------------------------------------- CP/M ASM86 1.1 SOURCE: U track for next rd/write 2521 E95126 4B75 jmp SETSEC ;set sector for next rd/write 2524 E99F26 4BC6 jmp SETDMA ;set offset for user buff (DMA) 2527 E9AA26 4BD4 jmp READ ;read a 128 byte sector 252A E9F226 4C * ;* * ;* Programmer: Suezawa/Ogawa/Shibayama * ;* Kozono/Takamura * SCBIOS.A86 Customized Basic I/O System V1 PAGE 2 ;| | bios_code equ 1200h ;start of LDBIOS 1F jmp WRITE ;write a 128 byte sector 252D E9D319 3F03 jmp LISTST ;return list status 2530 E98226 4BB5 jmp SECTRAN ;xlate logical->physical sector 2533 E99526 4BCB jmp SETDMAB ;set seg base for buff (DMA) 2536 ;* Revisions : 1.107:0015;D * ;* * ;********************************************* ; '83 07/07 FFFF  ccp_offset equ 0003h ;base of CPMLOADER bdos_ofst equ 0406h ;stripped BDOS entry ;| | ;----------------------------------- E99726 4BD0 jmp GETSEGT ;return offset of Mem Desc Table 2539 E9A223 48DE jmp GETIOBF ;return I/O map byte (IOBYTE) 253C E9A423 48E3 jmp SETIOBF ;set I/O map byte (IOBYTE) ;------------------ TRUE EQU -1 ; LOADER BIOS=0 ,CPM BIOS=-1 0000 false equ not true 000D cr equ 0dh ;carriage return 000A lf equ 0ah ;li---------- ENDIF ;loader_bios cseg org ccpoffset ccp: org bios_code CP/M ASM86 1.1 S--------------------------- ; 253F E9A22C 51E4 JMP NULL 2542 E99F2C 51E4 JMP NULL 2545 E99C2C 51E4 JMP NULL 2548 E9992C 51E4 JMP NULL 254B E9962C 51E4 JMP NULL 254E E9932C 5ne feed ;********************************************* ;* * ;* Loader_bios is true if assembling the * ;* LOOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 3 EJECT ;********************************************* ;* 1E4 JMP NULL 2551 E9902C 51E4 JMP NULL 2554 E98D2C 51E4 JMP NULL 2557 E98A2C 51E4 JMP NULL 255A E98A30 55E7 JMP FUNCT_50 ;direct bios call (function# 50) ; ORG SADER BIOS, otherwise BIOS is for the * ;* CPM.SYS file. * ;* * ;******************************************** * ;* BIOS Jump Vector for Individual Routines * ;* * ;********************************************* 25FKEYADDR_OFFSET 2560 005A SFKEYADDR DW OFFSET SFKEYTBL 2562 0000 SFKEYSEG DW 0 2564 C05C AUTSTRADDR DW OFFSET AUTSTRTBL 2566 0000 AUTSTRSEG DW 0 2568 * 0000 loader_bios equ false 00E0 bdos_int equ 224 ;reserved BDOS interrupt 00DC CALENDAR_INT EQU 220 00DC MELODY_INT EQU 220 00 E9FD00 2600 jmp INIT ;Enter from BOOT ROM or LOADER 2503 E98505 2A8B jmp WBOOT ;Arrive here from BDOS call 0 2506 E9B905 2AC2 jmp CONST ;return console keyboard status 2509 E9DB05 2AE7 jmp CONIN ;D25C PRTCNVADDR DW OFFSET TBLWORK 256A 0000 PRTCNVSEG DW 0 ;--------------- *R1.107 4/13/'83 ---------------------------- CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O IF not loader_bios ;--------------------------------------------- ;| | 2500 bios_code equ 2500h 2560 return console keyboard char 250C E99B0D 32AA jmp CONOUT ;write char to console device 250F E9BA17 3CCC jmp LISTOUT ;write character to list device 2512 E94322 4758 jmp PUNCH ;write character to punch device 2515 E9 System V1 PAGE 4 256C F45D SPCTBLADDR DW OFFSET SPCTBL 256E 7A5E ASCTBLADDR DW OFFSET ASCTBL 2570 0000 KBSEG DW 0 2572 0000  SFKEYADDR_OFFSET EQU 2560H 0000 ccp_offset equ 0000h 0B06 bdos_ofst equ 0B06h ;BDOS entry point ;| | ;--5622 476E jmp READER ;return char from reader device 2518 E95325 4A6E jmp HOME ;move to trk 00 on cur sel drive 251B E9E623 4904 jmp SELDSK ;select disk for next rd/write 251E E91526 4B36 jmp SETTRK ;setB  DW 0 2574 0000 DW 0 2576 8061 U_AUXCGADDR DW OFFSET U_AUXCGTBL 2578 0000 U_AUXCGSEG DW 0 257A E164 GDCSADADDR DW OFocations ; *** needed to permit 1) user control of status line use; 2) repositioning ; *** of status line to bottom (26th line) of screen. The routines needed ; *** to do this are 25AB FF DB 0FFH ; DEVICE J 25AC FF DB 0FFH ; DEVICE K 25AD FF DB 0FFH ; DEVICE L 25AE FFFSET KBSAD0 257C 0000 GDCSADSEG DW 0 257E 0000 GRFSADADDR DW 0 2580 RW 3 2586 00 ALTRBYTFLG DB 0 ; AUXCG FLAG not part of the BIOS, but need to locate these bios items ; *** in order to work. *** RMG / NECIS *** 9-9-83 ; ; 2592 1860 stslineaddr dw offset statusline  DB 0FFH ; DEVICE M 25AF FF DB 0FFH ; DEVICE N 25B0 FF DB 0FFH ; DEVICE O 25B1 FF  ; BIT 0 ASCII MODE ; 1 AUXCG 1 CHR. OUT ; 2 AUXCG CONTINUE OUT  ; *** RMG / NECIS *** 9-9-83 2594 0000 stslineseg dw 0 ; *** RMG / NECIS *** 9-9-83 ; 2596 833B kbscropataddr dw offset bsc010 ; *** RMG / NECIS ** DB 0FFH ; DEVICE P ; 00H - 03H FLOPPY DISK DEVICE ; 40H - 53H HARD DISK DEVICE ; 0FFH UNUSED  ; 3 AUXCG OUT BY ALT KEY ; 4 - 6 NOT USE ; 7 BDOS & BIOS ERROR MESSAGE OUT BIT 2587 80 * 9-9-83 2598 0000 kbscropatseg dw 0 ; *** RMG / NECIS *** 9-9-83 ; 259A CE3B crtdspaddr dw offset crtdsp ; *** RMG / NECIS *** 9-9-83 259C 0000  ; ( IF DB7 = ON , DRIVE IS NOT AVAILABLE ) ; ; ; *** The Hard Disk Area must directly follow the Sysunitid table to remain ; *** accessable to CONFIG v IOBYTE DB 80H ; I/OBYTE ;-------------------------------------------------------------- 2588 01 FDRAWF DB 1 ; FD READ AFTER WRITE FLAG --- '83 02/22 ---- 2589 00  crtdspseg dw 0 ; *** RMG / NECIS *** 9-9-83 ; 259E 1230 displaystsaddr dw offset dispstatus ; *** RMG / NECIS *** 9-9-83 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Cia the system table sysunidaddr entry! DO NOT ; *** insert any new data items here! *** RMG / NECIS *** 9-13-83 ; 25B2 HDADT EQU OFFSET $ ; HARD DISK AREA 00 DB 0 ; 0 = READ AFTER WRITE ; 1 = NON READ AFTER WRITE (DEFAULT) ; ; *** The following system table items hustomized Basic I/O System V1 PAGE 5 25A0 0000 displaystsseg dw 0 ; *** RMG / NECIS *** 9-9-83 ; ; SYSTEM D18 HDFTS EQU 24 ; DEFINITION TABLE ; DRIVE = 0 25B2 0800 HDST0 DW 8 ; START OF CYLINDER 25B4 D302 HDET0 DW 723 ave been added to make all necessary ; *** utility items accessable in a version independent manner. ; *** RMG / NECIS *** 9-12-83 ; 258A A225 sysunitidaddr dw EVICE INFORMATIONS 25A2 00 SYSUNITID DB 00H ; DEVICE A 25A3 01 DB 01H ; DEVICE B 25A4 02 DB 02H ;  ; END OF CYLINDER 25B6 1800 HDFT0 DW HDFTS0 ; NUMBER OF FREE CYLINDERS 0018 HDFTS0 EQU HDFTS ; ; ; DRIVE = 1  offset sysunitid ; *** RMG / NECIS *** 9-12-83; 258C 0000 sysunitidseg dw 0 ; *** RMG / NECIS *** 9-12-83; ; 258E FA25 biosveraddr dw offset biosver  DEVICE C 25A5 03 DB 03H ; DEVICE D 25A6 40 DB 40H ; DEVICE E 25A7 41 DB 41H ; DEVIC 25B8 D402 HDST1 DW 724 ; START OF CYLINDER 25BA 9F05 HDET1 DW 1439 ; END OF CYLINDER 25BC 1800 HDFT1 DW HDFTS1 ; NUMBER OF FREE CYLINDE ; *** RMG / NECIS *** 9-12-83 2590 0000 biosverseg dw 0 ; *** RMG / NECIS *** 9-12-83 ; ; *** Following additional system table items provide access to lE F 25A8 52 DB 52H ; DEVICE G 25A9 53 DB 53H ; DEVICE H 25AA FF DB 0FFH ; DEVICE I B RS 0018 HDFTS1 EQU HDFTS ; ; ; DRIVE = 2 25BE 0800 HDST2 DW 8 ; START OF CYLINDER 25C0 D302 HDET2 DW1B4F52000000 DB 1BH,'OR',0,0,0,0,0,0,0,0,0,0,0,0,0 000000000000 00000000 5B40 1B4F53000000 DB 1BH,'OS',0,0,0,0,0,0,0,0,0,0,0,0,0 000000000000 00000000 5B50 1B4F54000000  ; DUMMY =5CD7 00 DB 0 ; DUMMY = ; =5CD8 000102030405 SIDA1 DB 00H,01H,02H,03H,04H,05H,06H,07H 0607 =5CE0 08090A0B0C0D DB 08H,09H, 723 ; END OF CYLINDER 25C2 1800 HDFT2 DW HDFTS2 ; NUMBER OF FREE CYLINDERS 0018 HDFTS2 EQU HDFTS ; ; CP/M ASM86 1.1 SOUR DB 1BH,'OT',0,0,0,0,0,0,0,0,0,0,0,0,0 000000000000 00000000 5B60 RB 16*16 5C60 1B4F55000000 DB 1BH,'OU',0,0,0,0,0,0,0,0,0,0,0,0,0 000000000000 0AH,0BH,0CH,0DH,0EH,0FH 0E0F =5CE8 101112131415 DB 10H,11H,12H,13H,14H,15H,16H,17H 1617 =5CF0 18191A1B1C1D DB 18H,19H,1AH,1BH,1CH,1DH,1EH,1FH 1E1F =5CF8 202122232425 DB 20H,21H,2CE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 6 ; DRIVE = 3 25C4 D402 HDST3 DW 724 ; START OF CYLINDER 25C6 9F05 HDET3 00000000 5C70 1B4F56000000 DB 1BH,'OV',0,0,0,0,0,0,0,0,0,0,0,0,0 000000000000 00000000 5C80 1B4F57000000 DB 1BH,'OW',0,0,0,0,0,0,0,0,0,0,0,0,0 CP/M ASM86 1.1 SOURCE: USCBIOS.A82H,23H,24H,25H,26H,27H 2627 =5D00 28292A2B2C2D DB 28H,29H,2AH,2BH,2CH,2DH,2EH,2FH 2E2F =5D08 303132333435 DB 30H,31H,32H,33H,34H,35H,36H,37H 3637 =5D10 38393A3B3C3D DB 38H,39H,3A DW 1439 ; END OF CYLINDER 25C8 1800 HDFT3 DW HDFTS3 ; NUMBER OF FREE CYLINDERS 0018 HDFTS3 EQU HDFTS ; ; 6 Customized Basic I/O System V1 PAGE 7 000000000000 00000000 5C90 1B4F58000000 DB 1BH,'OX',0,0,0,0,0,0,0,0,0,0,0,0,0 000000000000 00000000 5CA0 1B4F5H,3BH,3CH,3DH,3EH,3FH 3E3F =5D18 404142434445 DB 40H,41H,42H,43H,44H,45H,46H,47H 4647 =5D20 48494A4B4C4D DB 48H,49H,4AH,4BH,4CH,4DH,4EH,4FH 4E4F =5D28 505152535455 DB 50H,51H,52H ; ; ; *** Flag error at assembly time if preceding data has grown past 25fah ; *** RMG / NECIS *** 9-12-83 ; if 9000000 DB 1BH,'OY',0,0,0,0,0,0,0,0,0,0,0,0,0 000000000000 00000000 5CB0 1B4F5A000000 DB 1BH,'OZ',0,0,0,0,0,0,0,0,0,0,0,0,0 000000000000 00000000 ; ,53H,54H,55H,56H,57H CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 8 5657 =5D30 58595A5B5C5D DB 58H,59H,5AH,5BH,5CH,5DH,5EH,5FH 5E5F =5D38 6061626(offset $) GT 25fah mov cs,0 ; >>>>>> error! data preceding 'biosver' has grown past 25fah endif ORG 25FAH ;  5CC0 5355424D4954 AUTSTRTBL DB 'SUBMIT AUTSTRT',CR,0 204155545354 52540D00 5CD0 C05C AUTSTRPTR DW AUTSTRTBL ; ;--------------------------------------36465 DB 60H,61H,62H,63H,64H,65H,66H,67H 6667 =5D40 68696A6B6C6D DB 68H,69H,6AH,6BH,6CH,6DH,6EH,6FH 6E6F =5D48 707172737475 DB 70H,71H,72H,73H,74H,75H,76H,77H 7677 =5D50 78797A7B ; *** This item now accessable via a system table entry *** RMG / NECIS ; 25FA 52312E313037 biosver DB 'R1.107' ; *** RMG / NECIS *** 9-12-83 ; ------ = INCLUDE USLIDATA.LIB = ;**** '83/04/12 **** = ;******************************************************************** = ;* LIST USER T7C7D DB 78H,79H,7AH,7BH,7CH,7DH,7EH,7FH 7E7F = ; =5D58 808182838485 DB 80H,81H,82H,83H,84H,85H,86H,87H 8687 =5D60 88898A8B8C8D DB 88H,89H,8AH,8BH,8CH,8DH,8EH,8FH  ; DSEG ORG 5A00H 5A00 SFKEYTBL RB 16*16 5B00 1B4F4F000000 DB 1BH,'OO',0,0,0,0,0,0,0,0,0,0,0,0,0 000000000000 ABLE ( TABLE WORK & CONVERT DATA ) * = ;******************************************************************** = ; =5CD2 80 TBLWORK DB 80H ; USER SET PARITY APOINT =5CD3 00  8E8F =5D68 909192939495 DB 90H,91H,92H,93H,94H,95H,96H,97H 9697 =5D70 98999A9B9C9D DB 98H,99H,9AH,9BH,9CH,9DH,9EH,9FH 9E9F =5D78 A0A1A2A3A4A5 DB 0A0H,0A1H,0A2H,0A3H,0A4H,0A5H,0A6H00000000 5B10 1B4F50000000 DB 1BH,'OP',0,0,0,0,0,0,0,0,0,0,0,0,0 000000000000 00000000 5B20 1B4F51000000 DB 1BH,'OQ',0,0,0,0,0,0,0,0,0,0,0,0,0 000000000000 00000000 5B30  WORKSO DB 00H ; USER SET SO DATA =5CD4 00 WORKSI DB 00H ; USER SET SI DATA =5CD5 00 DB 0 ; DUMMY =5CD6 00 DB 0 C ,0A7H A6A7 =5D80 A8A9AAABACAD DB 0A8H,0A9H,0AAH,0ABH,0ACH,0ADH,0AEH,0AFH AEAF =5D88 B0B1B2B3B4B5 DB 0B0H,0B1H,0B2H,0B3H,0B4H,0B5H,0B6H,0B7H B6B7 =5D90 B8B9BABBBCBD DB 0B8H,0B9H,00 0 1 1 1 ; 1=MASK ON ,0=MASK OFF ; NOTE: SLAVE PIC MASK ; (APU,OP7,OP6,FD,CRT/GRAPH,OP5,OP4, PAGE 10 2635 C7067003453F MOV EXT_FNC_INT_OFFSET,OFFSET EXT_FNC_INT 263B C7068003060B mov bdos_offset,bdos_ofst 2641 1F pop ds ;restore the DS regiBAH,0BBH,0BCH,0BDH,0BEH,0BFH BEBF =5D98 C0C1C2C3C4C5 DB 0C0H,0C1H,0C2H,0C3H,0C4H,0C5H,0C6H,0C7H C6C7 =5DA0 C8C9CACBCCCD DB 0C8H,0C9H,0CAH,0CBH,0CCH,0CDH,0CEH,0CFH CECF =5DA8 D0D1D2D3D4D5 ODA) 002A SICP2 EQU 2AH ; PORT2 INIT: ;print signon message and initialize hardware 2600 8CC8 mov ax,cs ;we entered with a JMPF so use 2602 8ED0 ster ; (additional CP/M-86 initialization) ; ; PIC INITIALIZATION 2642 B011 MOV AL,11H ; MASK PIC 2644 E620  DB 0D0H,0D1H,0D2H,0D3H,0D4H,0D5H,0D6H,0D7H D6D7 =5DB0 D8D9DADBDCDD DB 0D8H,0D9H,0DAH,0DBH,0DCH,0DDH,0DEH,0DFH DEDF =5DB8 E0E1E2E3E4E5 DB 0E0H,0E1H,0E2H,0E3H,0E4H,0E5H,0E6H,0E7H E6E7 =5DC0 mov ss,ax ;CS: as the initial value of SS:, 2604 8ED8 mov ds,ax ;DS:, 2606 8EC0 mov es,ax ;and ES: ;use local stack during initialization 2608 BCFB75 OUT ICP1,AL ; ICW1 2646 B020 MOV AL,20H ; 2648 E622 OUT ICP2,AL ; ICW2 264A B080 MOV AL,80H 264C E622 OUT ICP2,AL  E8E9EAEBECED DB 0E8H,0E9H,0EAH,0EBH,0ECH,0EDH,0EEH,0EFH EEEF =5DC8 F0F1F2F3F4F5 DB 0F0H,0F1H,0F2H,0F3H,0F4H,0F5H,0F6H,0F7H F6F7 =5DD0 F8F9FAFBFCFD DB 0F8H,0F9H,0FAH,0FBH,0FCH,0FDH,0FEH, mov sp,offset stkbase 260B FC cld ;set forward direction ;--------------------------------------------- ;|  ; ICW3 264E B001 MOV AL,01H 2650 E622 OUT ICP2,AL ; ICW3 ; ; SLAVE PIC INITIALIZATION NOTE ; ICW1=110FFH FEFF = ; = ; ;____________________________________________ CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 P | ; This is a BIOS for the CPM.SYS file. ; Setup all interrupt vectors in low ; memory to address trap 260C 1E push ds ;H,ICW2=28H,ICW3=07H,ICW4=01H ; ; TIMER INITIALIZE ; 2652 B030 MOV AL,30H ; MODE 0 (INTERRUPT BY COUNT END) 2654 E62F OUTAGE 9 EJECT ;********************************************* ;* * ;* INIT Entry Point, Differs for Lsave the DS register ;-------R1.107 07/07/'83 DELETE --------------- 260D B80000 mov ax,0 2610 8ED8 mov ds,ax 2612 8EC0 mov es,ax ;set ES and DS to zero  2FH,AL ; WRITE MODE (COUNTER 0) 2656 B004 MOV AL,04H ; 2658 E646 OUT 46H,AL ; 265A BA2900 MOV DX,29H ; DX=PORT NO. 265D 2AC0 DBIOS and * ;* BIOS, according to "Loader_Bios" value * ;* * ;*********************************************  ;setup interrupt 0 to address trap routine 2614 C7060000B52A mov int0_offset,offset int_trap 261A 8C0E0200 mov int0_segment,CS 261E BF0400 mov di,4 2621 BE0000  SUB AL,AL 265F EE OUT DX,AL 2660 B0F0 MOV AL,0F0H 2662 EE OUT DX,AL ; TIMER = 25 MS ; ; CALEN CSEG $ ORG 2600H ; ; PIC PORT ADDRESS 0020 ICP1 EQU 20H ; MASTER PIC 8259A PORT1 0022 ICP2 EQU 2 mov si,0 ;then propagate 2624 B9FE01 mov cx,510 ;trap vector to 2627 F3A5 rep movs ax,ax ;all 256 interrupts ;BDOS offset to proper interrupt DAR INITIALIZE 2663 B258 MOV DL,CLKPOT 2665 B005 MOV AL,MODCAN ; TEST MODE CANCEL 2667 EE OUT DX,AL 2668 0C08 OR AL,CLKSTB1 ; STB 1 2H ; PORT2 0028 SICP1 EQU 28H ; SLAVE PIC PORT1 00E7 PICMASK EQU 0E7H ; (SLAVE,OP3,OP2,KB,TIMER,OP1,SIO1,ASOP) ; 1 1 1  ; KB & TIMER INTERRUPT VECTER SET 2629 C70690004C2D MOV INTKB_OFFSET,OFFSET INTKB 262F C7068C00662E MOV INTTM_OFFSET,OFFSET INTTM CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 C 266A EE OUT DX,AL ; WRITE MODE 266B 2407 AND AL,CLKSTB0 ; STB 0 266D EE OUT DX,AL ; WRITE COMMAND ;  MOV AL,94H 26BD E66E OUT SODAMD,AL ; LSI MODE SET 26BF B005 MOV AL,05H 26C1 E66E OUT SODAW1,AL ; SET INTE FLAG 26C3 B090 MOV  ; = HDINIT: =26DF BB2467 MOV BX,OFFSET HDDMA_RW =26E2 E8E72E 55CC CALL HDWDMA ; DMA REGISTER WRITE =26E5 E493 IN AL,HDD_TC  ; MELODY S/W INITIALIZATION 266E B206 MOV DL,06H 2670 E87920 46EC CALL MLOUT ; OUT INITIAL CONTOROL COMMAMD ; ; GDC S/W INITIALIZATION 2673 E8 AL,90H 26C5 E66C OUT SODAW2,AL ; SET IRT AND MASK 26C7 B90300 MOV CX,03H ; SET LOOP TIME INIT010: 26CA E2FE 26CA LOOP INIT010 ; IDLE  ; DMA (LOW) READ =26E7 8AE0 MOV AH,AL =26E9 E493 IN AL,HDD_TC ; DMA (HIGH) READ =26EB 86C4 XCHG AL,AH =26ED 3DFF1F CMP AX,TCHD =26F0 1D15 3B93 CALL KBMOUT ; MULTI COMMAND OUTPUT 2676 0B DB 0BH 2677 0042 DW 4200H ; SYNC SET 2679 1040 DW 4010H 267B 4E40 LOOP (10 U/S) 26CC B00E MOV AL,0EH 26CE E66E OUT SODAW1,AL ; MASK PIC 26D0 B0E7 MOV AL,PICMASK 26D2 E622 OUT IC7544 2736 JNE HDINIT10 ; IF NO ADAPT ---- '83 02/17 ---- =26F2 B000 MOV AL,00H =26F4 E694 OUT 94H,AL ; H/W RESET =26F6 E6A2 OUT  DW 404EH 267D 4F40 DW 404FH ; *R1.131 '82 12/22 267F 1A40 DW 401AH CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 P2,AL 26D4 B0FF MOV AL,0FFH 26D6 E62A OUT SICP2,AL ;---------------- R1.132 '83 02/26 --------------- ; FDC SPECIFY  HDFIR0,AL ; =26F8 B080 MOV AL,80H ; =26FA E6A2 OUT HDFIR0,AL ; =26FC B000 MOV AL,00H =26FE E6A2 OUT HDFIR PAGE 11 2681 0640 DW 4006H ; *R1.131 '82 12/22 2683 1340 DW 4013H 2685 EE40 DW 40EEH 2687 4540 DW 4045H 2689 4742  ; SRT = 4 MSEC ; HUT = 176 MSEC ; HLT = 50 MSEC ; 26D8 BBA268 MOV BX,OFFSET FDC_SPECIFY 26DB FC 0,AL ; =2700 E6A9 OUT HDD_CMD,AL ; DMA CMD WRITE =2702 B00E MOV AL,0EH =2704 E69F OUT HDD_AMSK,AL ; ALL MASK WRITE =2706 E496  DW 4247H ; PITCH WRITE 268B 5040 DW 4050H 268D E8DD14 3B6D CALL KBSCRO ; SCROLL CMD OUTPUT 2690 B80000 MOV AX,00H 2693 BA0020 MOV  CLD 26DC E8CC2A 51AB CALL SENDCOM ;------------------------------------------------- CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 P IN AL,HDIRIN =2708 A840 TEST AL,40H =270A 740B 2717 JZ FMT_INIT ; IF FORMAT =270C C606096700 MOV HDFMTFG,00H ; FMT_FLAG RESET =2711 BB0A67  DX,2000H 2696 B9FF0F MOV CX,0FFFH 2699 E84D15 3BE9 CALL KBCRTC ; DATA CLEAR 269C B80010 MOV AX,1000H 269F BA8000 MOV DX,0080H 26A2 B9FF0F AGE 12 = INCLUDE HDINIT.LIB CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 13 = EJECT =  MOV BX,HDCCMD =2714 E8622D 5479 CALL HDPIO ; DISK SPECIFY = FMT_INIT: =2717 B000 MOV AL,00H =2719 E698 OUT 98H,AL  MOV CX,0FFFH 26A5 E84115 3BE9 CALL KBCRTC ; ATTRIBUTE RESET 26A8 C606DB6400 MOV LA,00H 26AD C606DC6400 MOV CA,00H 26B2 B85000 MOV AX,50H ; CSEG $ = ; '83 02/17 = ;*************************************************************** = ;* * =  ; HDIN / DMIN RESET = ;-------------------------- '83 02/17 ---------------------- = HDINIT05: =271B BB1E67 MOV BX,HDUNIT ; =271E E8582D 5479 CALL HDPIO  *R1.133 '83 03/10 26B5 E89614 3B4E CALL KBCSRO ; COUSOR OUTPUT 26B8 E8FC14 3BB7 CALL KBCSRD ; COUSOR DISPLAY ; LIST INITIALIZATION 26BB B094  ;* HARD DISK INITIALIZE AND MAKE ERROR MAP ROUTINE * = ;* * = ;*************************************************************** = D  ; PHYSICAL I/O =2721 83FB00 CMP BX,0 ; FMT NON AVAIRABLE =2724 7410 2736 JE HDINIT10 ; =2726 802760 AND BYTE PTR[BX],60H ; =27RROR =276A C60632601C MOV HDMRK,1CH ; HDMARK SET = NUNIT04: =276F FE06D36A INC INITCNT ; INITIALIZE COUNT UP =2773 A0D36A MOV AL,INITCNT 27B4 FE06D46A INC HDINITF = SETUNID: =27B8 8BF5 MOV SI,BP ; =27BA 8A0ED26A MOV CL,NDRIVE ; =27BE 2AED SUB 29 803F40 CMP BYTE PTR[BX],40H ; =272C 7508 2736 JNE HDINIT10 ; =272E F6470102 TEST BYTE PTR 1[BX],02H ; IF UNIT 0: IS READY =2732 74E7 271B JZ  ; =2776 3A06A168 CMP AL,HDNDISKS ; =277A 72C6 2742 JB NUNIT01 ; IF NEXT UNIT =277C 5D POP BP ; =277D 803ED46A00 CH,CH ; = SETUNID1: =27C0 AD LODS SI ; =27C1 8BD8 MOV BX,AX ; =27C3 800F80 OR BYTE PTR[BX],80H  HDINIT05 ; =2734 EB06 273C JMPS NUNIT ; = HDINIT10: =2736 C70627670000 MOV HDDMA_TC,0 ; NON ADPT SIGNE = ;------------------ CMP HDINITF,0 =2782 7419 279D JE NUNIT06 ; IF NOT READ ERROR =2784 2AE4 SUB AH,AH ; CLEAR AH =2786 BF416A MOV DI,OFFSET UNEMSG1 =2789 A0D46 ; ERROR BIT ON =27C6 E2F8 27C0 LOOP SETUNID1 ; =27C8 EBA5 276F JMPS NUNIT04 ; = ; = ; = ;***********************----------------------------------------- CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 14 = NUNIT: =273C 55 PUSH BP A MOV AL,HDINITF =278C D0E0 SHL AL,1 ; =278E 48 DEC AX ; =278F 03F8 ADD DI,AX =2791 BE486A MO***************************************** = ;* CHECK DRIVE ID POINT AND DRIVE COUNT * = ;* OUTPUT : BP = ID ADDRESS SAVE POINT * = ;*  ; =273D C606D36A00 MOV INITCNT,0 ; = NUNIT01: =2742 E88500 27CA CALL CHKDRV ; CHECK HARD DISK DRIVE =2745 80FA00 CMP DL,0 V SI,OFFSET UNEMSG2 =2794 B90E00 MOV CX,14 =2797 06 PUSH ES ; =2798 1E PUSH DS ; =2799 07 POP ES  : DL = DRIVE COUNT * = ;**************************************************************** = ; = CHKDRV: =27CA 8A26D36A MOV AH,IN ; =2748 7425 276F JE NUNIT04 ; IF NO DRIVE FOR THE UNIT =274A 8816D26A MOV NDRIVE,DL ; SAVE DRIVE COUNT =274E 833E276700 CMP HDDMA_TC,0 =2753 7463  ; =279A F3A5 REP MOVS AX,AX ; STRING COPY =279C 07 POP ES ; = NUNIT06: =279D E9BF01 295F JMP INIMEM00 ITCNT ; UNIT NO. =27CE B104 MOV CL,4 ; =27D0 D2E4 SHL AH,CL ; =27D2 80CC40 OR AH,40H ; AL = HDID =27D5 BEA225  27B8 JE SETUNID ; NON ADPT =2755 E89D00 27F5 CALL HDHOM ; RECALIBRATE & SENSE UNIT STATUS =2758 3C00 CMP AL,0 =275A 755C 27B8 JNE SETUNID  ; END OF HARD DISK INITIALIZE = ; = ;************ ERROR ROUTINE 1 ***************** = HDREDER: =27A0 A0D36A MOV AL,INITCNT ; AL = UNIT NO. = MOV SI,OFFSET SYSUNITID ; =27D8 BBD76A MOV BX,OFFSET ADDSET ; =27DB 8BEB MOV BP,BX ; =27DD 2AD2 SUB DL,DL ; COU ; IF ERROR UNIT = NUNIT02: =275C E8E000 283F CALL REDMAP ; ERROR MAP READ =275F 3C00 CMP AL,0 =2761 753D 27A0 JNE HDREDER ;27A3 0C30 OR AL,30H ; =27A5 2AED SUB CH,CH =27A7 8A0ED46A MOV CL,HDINITF CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 NTER RESET =27DF B91000 MOV CX,16 ; = CHKDRV1: =27E2 8A04 MOV AL,[SI] ; =27E4 24F0 AND AL,0F0H ; =27E6 3AC IF READ ERROR = NUNIT03: =2763 E83101 2897 CALL ERSET ; WRITE BIT MAP SET =2766 3C00 CMP AL,0 =2768 7536 27A0 JNE HDREDER ; IF READ E PAGE 15 =27AB D0E1 SHL CL,1 ; =27AD BB416A MOV BX,OFFSET UNEMSG1 =27B0 03D9 ADD BX,CX =27B2 8807 MOV [BX],AL =D 4 CMP AL,AH ; =27E8 7507 27F1 JNE CHKDRV2 ; NO MATCH =27EA FEC2 INC DL ; =27EC 8937 MOV [BX],SI 2 283B je hdffer ; if not status point error =2829 8B07 mov ax,[bx] ; status read =282B 2460 and al,60h =282D 3C40 cmp al,40 PAGE 17 =286A 3C40 CMP AL,40H =286C 7517 2885 JNE REMAPER ; IF READ ERROR =286E 1E PUSH DS =286F B8009C  ; ADDRESS SAVE =27EE 83C302 ADD BX,2 ; = CHKDRV2: =27F1 46 INC SI ; =27F2 E2EE 27E2 LOOP CHKDRV1 h =282F 750A 283B jne hdffer ; if error =2831 F6D4 not ah =2833 F6C41E test ah,1eh =2836 7503 283B jnz hdffer ; if error =2838 B00 MOV AX,9C00H =2872 8ED8 MOV DS,AX ; HARD DISK ADDRESS =2874 07 POP ES ; =2875 06 PUSH ES ; SEGMENT =2876 B980 ; NEXT ID CHECK =27F4 C3 RET ; END = ; = ;********* HARD DISK RECALIBRATE & SENSE UNIT STATUS *********** = ; = 0 mov al,0 = homret: =283A C3 ret = ; = hdffer: =283B B0FF mov al,0ffh ; error return =283D EBF00 MOV CX,80H ; COUNTER =2879 BFE66B MOV DI,OFFSET R_W_BUFF2D =287C BE0000 MOV SI,0 =287F F3A5 REP MOVS AX,AX ; LOAD HARD DISK DA hdhom: =27F5 A0D36A mov al,initcnt ; unit no = al =27F8 8AE0 mov ah,al ; =27FA 0C50 or al,50h ; recalibrate cmd CP/M ASM86 1.1 B 283A jmps homret = ; = ;************************************************************** = ;* HARD DISK READ ERROR MAP SUBROUTINE * = TA TO SYS =2881 1F POP DS =2882 B000 MOV AL,00H = READMAPRET: =2884 C3 RET = REMAPER: =2885 803E1A670C cmp lsn,0SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 16 =27FC 80CC30 or ah,30h ; sense unit status cmd =27FF A21D67 mov rechd,al  ;* IN AL = UNIT NO. * = ;************************************************************** = ; = REDMAP: =283F A0D36A ch =288A 7504 2890 jne onered ; if again read =288C B0FF MOV AL,0FFH ; ERROR END =288E EBF4 2884 JMPS READMAPRET ; RETURN =  ; unit and cmd set =2802 88261F67 mov hduncmd,ah ; unit and cmd set =2806 BB1C67 mov bx,hdhomer ; hdhomer address = bx =2809 E86D2C 5479 call hdpio  MOV AL,INITCNT =2842 B3B0 MOV BL,0B0H ; BL = READ CMD =2844 0AC3 OR AL,BL ; AL = READ CMD + UNIT NO. =2846 A21567 MOV HDRWCMD,AL =  onered: =2890 C6061A670C mov lsn,0ch ; sector count no = 13 =2895 EBB2 2849 jmps oneread = ; = ; = ;*************************** ; physical i/o call =280C 83FB00 cmp bx,0 =280F 742A 283B je hdffer ; if not status point error =2811 8B07 mov ax,[bx] ; status read =2813 2460  oneread: =2849 C7062767FF00 mov hddma_tc,00ffh ; hd dma terminal counter =284F BB2467 MOV BX,HDDMA ; HARD DISK DMA PARAMETER SET =2852 C606246715 MOV HDDMA************************************** = ;* ERROR MAP SET ROUTINE * = ;***************************************************************** = ; =  and al,60h =2815 3C40 cmp al,40h =2817 7522 283B jne hdffer ; if error =2819 F6C480 test ah,80h =281C 741D 283B jz hdffer _RW,15H =2857 E8722D 55CC CALL HDWDMA =285A BB1467 MOV BX,HDIOCB ; OFFSET HARD DISK DATA CMD =285D E8192C 5479 CALL HDPIO ; PHYSICAL I/O CALL =2860 C7062767FF1F  ERSET: =2897 BBE66B MOV BX,OFFSET R_W_BUFF2D ; ERROR MAP READ POINT =289A 8B07 MOV AX,[BX] ; AX = -E-R- =289C 3D4552 CMP AX,5245H =289F 7510  ; if error =281E BB1E67 mov bx,hdunit ; sens unit cmd pointer =2821 E8552C 5479 call hdpio ; physical i/o call =2824 83FB00 cmp bx,0 =2827 741 mov hddma_tc,tchd ; hd tc = 8k =2866 8A07 MOV AL,[BX] ; AL = STATUS =2868 2460 AND AL,60H CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 E  28B1 JNE ERSET01 ; IF NOT READ =28A1 8B4702 MOV AX,2[BX] ; AX = -M-A- =28A4 3D4D41 CMP AX,414DH =28A7 7508 28B1 JNE ERSET01  ; GET ERROR MAP POINT =28D4 8A4404 MOV AL,4[SI] ; FREE SPACE SIZE (TRACKS) =28D7 2AE4 SUB AH,AH ; =28D9 8BE8 MOV BP,AX ; = POP DX ; =290D EB04 2913 JMPS WRTB040 ; = WRTB030: =290F B90800 MOV CX,8 ; =2912 AC LODS BYTE PTR SI  ; IF NOT READ =28A9 8B4704 MOV AX,4[BX] ; AX = -P-SP- =28AC 3D5020 CMP AX,2050H =28AF 7404 28B5 JE ERSET02 ; IF NOT READ = ERSET0128DB 45 INC BP ; =28DC 55 PUSH BP ; =28DD 8B5402 MOV DX,2[SI] ; DX = END OF TRACK =28E0 42 INC  ; = WRTB040: CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 19 =2913 3BD3 CMP DX,BX ; IF OVER EOT =291: =28B1 B0FF MOV AL,0FFH =28B3 EB0E 28C3 JMPS ERSET04 ; IF ERROR RETURN = ERSET02: =28B5 E80C00 28C4 CALL WRTBIT ; WRITE ERROR MAP SUBRO DX ; DX = EOT + 1 =28E1 8B04 MOV AX,[SI] ; AX = START OF TRACK =28E3 8BD8 MOV BX,AX ; =28E5 50 PUSH AX 5 741B 2932 JE WRTB070 ; =2917 0AC0 OR AL,AL ; =2919 740F 292A JZ WRTB060 ; NON ERROR =291B D0E0 SHL AL,1 UTINE =28B8 83C502 ADD BP,2 ; NEXT DRIVE =28BB FE0ED26A DEC NDRIVE ; =28BF 75F4 28B5 JNZ ERSET02 ; =28C1 B000 MOV  ; =28E6 57 PUSH DI ; =28E7 1E PUSH DS ; =28E8 07 POP ES ; ES = DS =28E9 B103 MOV  ; =291D 7308 2927 JNB WRTB050 ; =291F 4D DEC BP ; =2920 7410 2932 JZ WRTB070 ; ERROR MAP FULL =2922 891D  AL,0 ; IF NO ERROR = ERSET04: =28C3 C3 RET = ; CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE CL,3 ; =28EB D3EB SHR BX,CL ; BX = START OF CYLINDER =28ED BEEE6B MOV SI,OFFSET R_W_BUFF2D+8 ; =28F0 03F3 ADD SI,BX ; =28F2 MOV [DI],BX ; BAD TRACK NUMBER SET =2924 83C702 ADD DI,2 ; = WRTB050: =2927 43 INC BX ; =2928 E2E9 29118 = ;************************************************************** = ;* CONVERT ERROR BIT MAP & SET DISK SIZE MAX * = ;********************************************* 83C702 ADD DI,2 ; =28F5 B103 MOV CL,3 ; =28F7 D3E3 SHL BX,CL ; BX = CURRENT TRACK NUMBER =28F9 3BC3 CM3 LOOP WRTB040 ; = WRTB060: =292A 03D9 ADD BX,CX ; =292C 3BDA CMP BX,DX ; =292E 72DF 290F JB WRT***************** = ; = ; --------------------*R1.131 '83 01/31-------------------- = WRTBIT: =28C4 06 PUSH ES ; =28C5 55 P AX,BX ; =28FB 7412 290F JE WRTB030 ; =28FD B90800 MOV CX,8 ; =2900 52 PUSH DX ; =2901 8BD0 B030 ; =2930 8BDA MOV BX,DX ; = WRTB070: =2932 5F POP DI ; =2933 58 POP AX  PUSH BP ; =28C6 8BDD MOV BX,BP ; BX = HD SYSUNITID ADDRESS =28C8 8B1F MOV BX,[BX] ; =28CA 8A0F MOV CL,[BX]  MOV DX,AX ; =2903 AC LODS BYTE PTR SI ; = WRTB020: =2904 D0E0 SHL AL,1 ; =2906 43 INC BX ; AX = START OF TRACK =2934 59 POP CX ; CX = NUMBER OF FREE TRACKS =2935 8BD1 MOV DX,CX ; =2937 4A DEC DX ; =2938 ; CL = UNIT ID =28CC 81E10F00 AND CX,000FH ; CL = DRIVE NUMBER =28D0 51 PUSH CX ; SAVE DRIVE NUMBER =28D1 E88221 4A56 CALL GETPMAP  ; =2907 49 DEC CX ; =2908 3BD3 CMP DX,BX ; =290A 75F8 2904 JNE WRTB020 ; =290C 5A E  2BCD SUB CX,BP ; CX = NUMBER OF BAD TRACKS =293A 890D MOV [DI],CX ; =293C 2BD8 SUB BX,AX ; EOT - SOT =293E 2BDA ******** = A55A MEMCHKWD EQU 0A55AH = 0000 MEMCHKADS EQU 0 = FFFE MEMCHKADE EQU 0FFFEH = 9C00 MEMMAXSIZE EQU 9C00H ; --*'83/03/08 --  MOV BX,OFFSET SEG_TABLE =29A8 894703 MOV 3[BX],AX =29AB E93400 29E2 JMP INIMEMCHKEND = ; = ; = MEMCHKRTN: =  SUB BX,DX ; BX = NUMBER OF AVAILABLE TRACKS =2940 8BC3 MOV AX,BX ; =2942 BB1A00 MOV BX,26 ; =2945 F7E3 MUL BX = INIMEM00: =295F BB0020 MOV BX,2000H = INIMEMCHK0: = ; CHECK MEMORY SIZE BY 128 K BYTES =2962 E84900 29AE CALL MEMCHKRTN =2965 3C00  ; INPUT BX = MEM SEGMENT ADDRESS = ; OUTPUT AL=0 ; NORMAL (MEM EXIST) = ; =-1 ; ERROR (MEM NOT EXIST) = ; = ; . CHECK BX:0000H & (B ; =2947 B105 MOV CL,5 ; =2949 D3E8 SHR AX,CL ; =294B 48 DEC AX ; AX = (DX*26)/32-1 =294C BE7472  CMP AL,0 =2967 7532 299B JNE INIMEMCHK4 =2969 81C30020 ADD BX,2000H =296D 81FB0080 CMP BX,8000H =2971 7402 2975 JE INIMEMCHK1 =2973 EBED 2962 X+1000H):FFFEH ADDRESS CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 21 = ; PERFORM READ AFTER WRITE WITH CHECK DATA (WD) = ;  MOV SI,OFFSET HDDPE0 ; SI = HARD DISK DPE0 OFFSET =294F 5A POP DX ; DX = DRIVE NUMBER =2950 B104 MOV CL,4 ; =2952 D3E2  JMPS INIMEMCHK0 = ;---------* R1.133 '83/03/08 *-------------------------------- = INIMEMCHK1: =2975 BEFEFF MOV SI,MEMCHKADE ; CHECK MEMORY ADDRESS =  =29AE 06 PUSH ES =29AF 53 PUSH BX =29B0 8EC3 MOV ES,BX =29B2 BB0000 MOV BX,MEMCHKADS =29B5 26C7075AA5 MOV ES:[BX],MEMCHKWD =29BA 26 SHL DX,CL ; DX = DRIVE*16 =2954 03F2 ADD SI,DX ; SI = HARD DISK DPE DRIVE POINT =2956 8B5C0A MOV BX,10[SI] ; =2959 894705 MOV  INIMEMCHK2: =2978 06 PUSH ES ; SAVE SEGMENT =2979 8EC3 MOV ES,BX ; CHECK SEGMENT =297B 26C7045AA5 MOV ES:[SI],MEMCHKWD ; =2980 2688B07 MOV AX,ES:[BX] =29BD 3D5AA5 CMP AX,MEMCHKWD =29C0 751B 29DD JNE MEMCHKERR =29C2 8CC0 MOV AX,ES =29C4 050010 ADD AX,1000H =29C7 8EC0  5[BX],AX ; SET DISK SIZE MAX =295C 5D POP BP ; =295D 07 POP ES ; =295E C3 RET ; = B04 MOV AX,ES:[SI] ; AX = CHECK DATA =2983 07 POP ES =2984 3D5AA5 CMP AX,MEMCHKWD ; =2987 7512 299B JNE INIMEMCHK4 ; IF N MOV ES,AX ; SET NEXT SEGMENT =29C9 BBFEFF MOV BX,MEMCHKADE =29CC 26C7075AA5 MOV ES:[BX],MEMCHKWD =29D1 268B07 MOV AX,ES:[BX] =29D4 3D5AA5  ; = ; --------------------------------------------------------- ; = INCLUDE MEMCHK.LIB = ; '83/03/08 = ;*******OT MEMORY =2989 81FB0090 CMP BX,9000H =298D 7409 2998 JE INIMEMCHK3 ; IF END ROUTINE =298F 81C30010 ADD BX,1000H ; SEGMENT UP =2993 BEFEBF MOV CMP AX,MEMCHKWD =29D7 7504 29DD JNE MEMCHKERR =29D9 32C0 XOR AL,AL =29DB EB02 29DF JMPS MEMCHKRTNRET = MEMCHKERR: =29DD 0CFF OR AL************************************************* = ;* MEMORY SIZE CHECK * CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE  SI,0BFFEH ; MEMORY CHECK ADDRESS =2996 EBE0 2978 JMPS INIMEMCHK2 = INIMEMCHK3: =2998 BB009C MOV BX,MEMMAXSIZE ; BX = 9C00H = ;-----------,0FFH = MEMCHKRTNRET: =29DF 5B POP BX =29E0 07 POP ES =29E1 C3 RET = INIMEMCHKEND: = = = ;---------- 20 = ;* 128 K (MIN)/256 K / 384 K / 512 K * = ;* . SET MEMORY LENGTH TO SEG_TABLE * = ;************************************************-------------------------------------------------- = INIMEMCHK4: =299B 81EB0020 SUB BX,2000H =299F 81C30018 ADD BX,TPA_LEN =29A3 8BC3 MOV AX,BX =29A5 BBE76D F ---------------------------------------- 29E2 BBE26A mov bx,offset signon 29E5 E8011F 48E9 call pmsg ;print signon message 29E8 803ED46A00 CMP HDINITF,0 29ED 7406 29F5  sub bx,dx ; 2A28 8ACB mov cl,bl 2A2A EB19 2A45 jmps startdrv hdloader: 2A2C 55 push bp ; save bp 2A2D 240RESS 2A69 2EA37825 MOV U_AUXCGSEG,AX ; SET UNIVERSAL CG TABLE SEGMENT ADDRESS ;---------------------------------------------------------------------- ; *** New system table segment  JE INITGDC ; IF HARD DISK NOT READ ERROR 29EF BB2D6A MOV BX,OFFSET UNEMSG 29F2 E8F41E 48E9 CALL PMSG INITGDC: 29F5 B9FFFF mov cx,0FFFFH ;IDLEF and al,0fh ; 2A2F A2D36A mov initcnt,al ; hard disk unit No. 2A32 E895FD 27CA call chkdrv ; hard disk drive check 2A35 80FA00 cmp dl,0 items *** RMG / NECIS *** 9-9-83 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 23 2A6D 2EA39425 mov stslineseg,ax ; *** RMG / NECIS *** 9-9-83 2A71 2EA LOOP 228ms INITGDCEND: 29F8 E2FE 29F8 loop INITGDCEND 29FA B06B mov al,6bh 29FC E642 out 42h,al ; disp start ;--------------*R 1 ; not ready hard disk unit drive 2A38 7411 2A4B je hdload01 ; if dl = 0 then hlt 2A3A E85100 2A8E call chklod ; loader on load dirve check 2A3D 80FA00 38C25 mov sysunitidseg,ax ; *** RMG / NECIS *** 9-12-83 2A75 2EA39025 mov biosverseg,ax ; *** RMG / NECIS *** 9-12-83 2A79 8CC8 mov ax,cs ; *** RMG / NECIS *** 9-9-.131,'83/02/24-------------- 29FE 06 push es ; coldstart drive No. search 29FF BB0010 mov bx,1000h ; 2A02 8EC3 mov es,bx ; es = segmant  cmp dl,0 2A40 7409 2A4B je hdload01 ; if dl = 0 then hlt 2A42 5D pop bp 2A43 8ACA mov cl,dl ; cl = currnt drive No. startdrv: 83 2A7B 2EA39825 mov kbscropatseg,ax ; *** RMG / NECIS *** 9-9-83 2A7F 2EA39C25 mov crtdspseg,ax ; *** RMG / NECIS *** 9-9-83 2A83 2EA3A025 mov displaystsseg,ax ; *** RMG / NEC 2A04 BBFFFF mov bx,0ffffh ; es:[bx] = loader flag address 2A07 268A07 mov al,es:[bx] ; al = loader flag 2A0A 07 pop es ; 2A0B 2AC9 2A45 880EB724 mov byte ptr .sysdrv,cl ; dl = start drive No. 2A49 EB08 2A53 jmps initseg ;-------- if hard disk is not defined msg ---*'83/02/25 hdload01: 2A4B IS *** 9-9-83 ; 2A87 FB STI ; ENABLE INTERRUPT 2A88 E975D5 0000 jmp ccp ;jump to cold start entry of CCP 2A8B E978D5 0006 WBOOT: jmp ccp+6 sub cl,cl ; clear cl CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 22 2A0D A8EC test al,0ech ; 2A0F 7542 2A53 jnz 5D pop bp 2A4C BB646A mov bx,offset notdefmsg 2A4F E8971E 48E9 call pmsg 2A52 F4 hlt  ;direct entry to CCP at command level ; ;---------------*R1.131,'83/02/25--------------- ;***************************************************************  initseg ; if drive a: coldstart 2A11 3C10 cmp al,10h ; 2A13 7317 2A2C jae hdloader ; if hard disk coldstart 2A15 BBA225 mov bx,offset sysunitid ; id offset ;--------------------------------------------*'83/02/25 ;default to dr A: on coldstart INITSEG: 2A53 8CD8 MOV AX,DS 2A55 2EA36225 MOV SFKEYSEG,AX  ;* HARD DISK LOADER CHECH ROUTINE * ;* IN DL = DRIVE COUNT * ;* BP = SYSUNIT ID ADDERSS *  2A18 8BD3 mov dx,bx ; 2A1A B91000 mov cx,16 ; counter fdlod00: 2A1D 3A07 cmp al,[bx] ; 2A1F 7405 2A26 je ; SET SOFT KEY TABLE SEGMENT ADDRESS 2A59 2EA36625 MOV AUTSTRSEG,AX ; SET AUTOSTART TABLE SEGMENT ADDRESS 2A5D 2EA36A25 MOV PRTCNVSEG,AX ; SET LIST OUT TABLE SEGMENT ADDRESS ;- ;*************************************************************** ; 24B7 SYSDRV EQU 24B7H ; SYSTEM DRIVE ADDRESS ; CH fdlod01 2A21 43 inc bx 2A22 E2F9 2A1D loop fdlod00 ; if next cmp 2A24 EB2D 2A53 jmps initseg ; if drive a: coldstart fdlod01: 2A26 2BDA --------------* R1.107 4/27/'83 ------------------------------------- 2A61 2EA37025 MOV KBSEG,AX ; SET KEY BOARD TABLE SEGMENT ADDRESS 2A65 2EA37C25 MOV GDCSADSEG,AX ; SET GDC MEMORY TABLE SEGMENT ADDF KLOD: 2A8E 2AED SUB CH,CH ; CLEAR CH 2A90 8ACA MOV CL,DL ; COUNTOR 2A92 8BF5 MOV SI,BP ; SI = HARD DISK ID POINT 2A94  SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 25 EJECT ;********************************************* ;*  AL,00H =2AE2 EB02 2AE6 JMPS CONST030 = CONST020: =2AE4 B0FF MOV AL,0FFH ; READY TO GET DATA = CONST030: =2AE6 C3 RET = 8B1C MOV BX,[SI] ; BX = ID ADDRESS 2A96 8A07 MOV AL,[BX] ; AL = ID DATA 2A98 8BD3 MOV DX,BX ; SAVE ID ADDRESS 2A9A 80F901  * ;* CP/M Character I/O Interface Routines * ;* * ;*********************************************  ;********************************************* = ;* * = ;* CONIN (CONSOLE INPUT) * = ;*  CMP CL,1 ; 2A9D 7411 2AB0 JE CHKLOD03 ; IF LOAD POINT CHKLOD01: 2A9F 83C602 ADD SI,2 ; HARD DISK ID POINT UP  ;----------------------------------------------- = INCLUDE USCONIN.LIB = ; '83 05/28 = ; = ; KB EQU TABLE =  * = ;********************************************* = CONIN: =2AE7 FC CLD = CONIN000: CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System 2AA2 8B1C MOV BX,[SI] ; NEXT ID ADDRESS 2AA4 8A27 MOV AH,[BX] ; NEXT ID DATA 2AA6 3AC4 CMP AL,AH ; 2AA8 7204 2AAE  ; = 004A KBSTP EQU 4AH ; KB STATUS PORT = 0048 KBINP EQU 48H ; KB DATA INPUT PORT = 004C KBSWP EQU 4CH ; KB READ SIGNAL PORT = 004E KBSFP EQU  V1 PAGE 26 = ; AUTO START PROC =2AE8 8B1ED05C MOV BX,AUTSTRPTR ; BX = AUTO START TABLE ADDR =2AEC 8A07 MOV AL,BYTE PTR[BX] ; AUTO START JB CHKLOD02 ; IF AL < AH THEN AFTER CHECK 2AAA 8AC4 MOV AL,AH ; AL > AH = LOAD AL,AH 2AAC 8BD3 MOV DX,BX ; SAVE ADDRESS  4EH ; KB READ SHIFT PORT = ;********************************************** = ;* * = ;* CONST (CONSOLE STATUS) * =  MASAGE GET =2AEE 3C00 CMP AL,0 =2AF0 7408 2AFA JE CONIN00 ; IF NOTHING AUTO START MASAGE =2AF2 43 INC BX ; POINTER UP =2AF3 891ED05C MOV  CHKLOD02: 2AAE E2EF 2A9F LOOP CHKLOD01 ; AFTER CHECK CHKLOD03: 2AB0 81EAA225 SUB DX,OFFSET SYSUNITID ; DL = ON LOADER DRIVE 2AB4 C3 RE ;* * = ;********************************************** = CONST: = ; CHECK DISABLE/ENABLE KEY BOARD INPUT =2AC2 803E606100 AUTSTRPTR,BX ; POINTER SAVE =2AF7 E99800 2B92 JMP CONINRET = CONIN00: = ; SOFT KEY PROC. =2AFA 803E596100 CMP SFKEYFLG,0 ; CHECK SOFTKEY =2AFF 7411 2B12T ;-------------------------------------------- int_trap: 2AB5 CF IRET ; *R1.131 '82 12/22 2AB6 FA cli ;block CMP SYSKEYINFLG,0 =2AC7 7517 2AE0 JNE CONST010 ; IF DISABLE KEY BOARD INPUT = ; CHECK IF SOFT KEY MODE =2AC9 803E596100 CMP SFKEYFLG,0 ; CHECK SOFTKEY MODE =2 JE CONIN010 ; MODE =2B01 8B1E5A61 MOV BX, SFKEYPTR =2B05 8A07 MOV AL,[BX] =2B07 FF065A61 INC SFKEYPTR =2B0B FE0E5961 DEC SFKEYFLG =2B0F  interrupts 2AB7 8CC8 mov ax,cs 2AB9 8ED8 mov ds,ax ;get our data segment 2ABB BB4D6B mov bx,offset int_trp CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O SystemACE 7514 2AE4 JNE CONST020 ; YES = ; CHECK IF KB FIFO = EMPTY ? =2AD0 A01661 MOV AL,KBIN =2AD3 3A061761 CMP AL,KBOUT =2AD7 750B 2AE4 JNEE95E00 2B70 JMP CONIN030 = CONIN010: =2B12 E8ADFF 2AC2 CALL CONST =2B15 3C00 CMP AL,0 =2B17 74F9 2B12 JE CONIN010 =2B19 803ED85D00 CM V1 PAGE 24 2ABE E8281E 48E9 call pmsg 2AC1 F4 hlt ;hardstop ;-------------------------------------------- CP/M ASM86 1.1 CONST020 ; NOT EMPTY = ; CHECK REPEAT STATUS =2AD9 803ED85D00 CMP KBREPFLG,0 =2ADE 7504 2AE4 JNE CONST020 = CONST010: =2AE0 B000 MOV G P KBREPFLG,0 =2B1E 740A 2B2A JE CONIN018 = ; REPEAT PROC =2B20 C606D85D00 MOV KBREPFLG,0 =2B25 A0EB5D MOV AL,SVDATA =2B28 EB03 2B2D JMPS CONINLATCHFD =2B6E 0420 ADD AL,20H ; CODE CONVERT (LARGE <-- SMALL) = CONIN030: = ; AND AL,7FH ; REMOVE PARITY BIT = CONIN040: =  KBGETRET: =2BBD 880E1761 MOV KBOUT,CL CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 28 =2BC1 59 POP CX =2BC2 C3 N019 = ; GET KEY IN DATA FROM KB FIFO BUFFER = CONIN018: =2B2A E86A00 2B97 CALL KBGET = CONIN019: =2B2D E89300 2BC3 CALL CODCHNG ; DATA CHECK ; CHECK IF ROLL DOWN WAS OCCURED =2B70 803ED96400 CMP ROLDCNT,0 =2B75 741B 2B92 JE CONINRET =2B77 50 PUSH AX =2B78 2AED SUB CH,CH =2B7A 8A0ED96 RET = ;********************************************************************** = ;* KEY-IN DATA CHECK AND CHANGE ROUTINE * = ;*  AND CONV. =2B30 803E596100 CMP SFKEYFLG,0 =2B35 75B1 2AE8 JNE CONIN000 =2B37 80FA00 CMP DL,00H =2B3A 74AC 2AE8 JE CONIN000 = CONIN020: = 4 MOV CL,ROLDCNT = CONIN045: =2B7E E8530E 39D4 CALL ROLLUP =2B81 E2FB 2B7E LOOP CONIN045 =2B83 8A36DB64 MOV DH,LA =2B87 8A16DC64 MOV  * = ;* INPUT AL ; JIS8 CODE * = ;* OUTPUT DL ; = 0 : ERROR RETURN * =  ; CHECK FOR UPPER OR LOWER CASE OF ENGLISH LETTER =2B3C C606D95D00 MOV KBULFLG,0 =2B41 F6065D6180 TEST KBSW1,80H =2B46 7504 2B4C JNZ CONIN021 =2B48 FE06D95D  DL,CA =2B8B E8680F 3AF6 CALL KBLCCV =2B8E E8BD0F 3B4E CALL KBCSRO =2B91 58 POP AX = CONINRET: =2B92 8A265D61 MOV AH,KBSW1 ;AH=GENEREATE C ;* = FF : NORMAL RETURN * = ;* AL = ASCII CODE * = ;******************************************INC KBULFLG = CONIN021: = ;-------------- R1.107 '83 4/27 DELEAT ------------------------ =2B4C 3C41 CMP AL,41H =2B4E 7C20 2B70 JL CONIN030 ; IF NOT NOONTROLL DATA =2B96 C3 RET = ;********************************************************************** = ;* KBGET * = **************************** = CODCHNG: =2BC3 2AE4 SUB AH,AH =2BC5 2AED SUB CH,CH = ; CHECK FUNCTION KEY (SOFT KEY) =2BC7 50 MAL (A-Z) KEY SHIFTED =2B50 3C5A CMP AL,5AH =2B52 7E13 2B67 JLE CONIN023 ; IF NOMAL (A-Z) KEY SHIFTED =2B54 3C61 CMP AL,61H =2B56 7C18 2B70 JL CONIN030  ;* GET KEY IN DATA FROM KB FIFO BUFFER * = ;********************************************************************** = KBGET: =2B97 51 PUSH C PUSH AX =2BC8 3D8000 CMP AX,80H =2BCB 723D 2C0A JB CDCNG040 =2BCD 3D9500 CMP AX,95H =2BD0 7F38 2C0A JG CDCNG040 ; IF NOT PF KEY =2B ; IF NOT NOMAL (A-Z) KEY UNSIFTED =2B58 3C7A CMP AL,7AH =2B5A 7F14 2B70 JG CONIN030 ; IF NOT NOMAL (A-Z) KEY UNSIFTED CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 X = =2B98 2AE4 SUB AH,AH =2B9A BB1861 MOV BX,OFFSET KBFIFO =2B9D A01761 MOV AL,KBOUT =2BA0 03D8 ADD BX,AX =2BA2 8A07 MOV AL,[BX] D2 2C80 SUB AL,80H =2BD4 B104 MOV CL,4 =2BD6 D3E0 SHL AX,CL =2BD8 BB005A MOV BX,OFFSET SFKEYTBL =2BDB 03D8 ADD BX,AX =2BDD F6065 PAGE 27 = CONIN022: =2B5C 803ED95D00 CMP KBULFLG,0 =2B61 750D 2B70 JNE CONIN030 ; IF CAPS KEY UNLATCHED =2B63 2C20 SUB A ; GET CONTROL CODE =2BA4 A25D61 MOV KBSW1,AL =2BA7 8A4701 MOV AL,1[BX] ; GET DATA =2BAA A2EB5D MOV SVDATA,AL = ; MAINTENANCE KBOUT POINTER =2BAD D6101 TEST KBSW1,01H =2BE2 7404 2BE8 JZ CDCNG010 ; PF (1-16) =2BE4 81C36001 ADD BX,22*16 ; PF + FNC = CDCNG010: =2BE8 891E5A61 L,20H ; CODE CONVERT (SMALL <-- LARGE) =2B65 EB09 2B70 JMPS CONIN030 = CONIN023: =2B67 803ED95D00 CMP KBULFLG,0 =2B6C 7502 2B70 JNE CONIN030 ; IF CAPS KEY UB100 MOV CL,0 =2BAF 803E17613E CMP KBOUT,KBFIFOSZ-2 =2BB4 7407 2BBD JE KBGETRET =2BB6 8A0E1761 MOV CL,KBOUT =2BBA 80C102 ADD CL,2 = G  MOV SFKEYPTR,BX ; INITIALIZE POINTER =2BEC C606596100 MOV SFKEYFLG,0 = CDCNG020: =2BF1 8A07 MOV AL,[BX] =2BF3 3C00 CMP AL,0 =2BF5 7407  CHECK AND CONVERT ROUTINE * = ;* INPUT AL ; SPECIAL KEY CODE * = ;* BX ; SPECIAL KEY TABLE ADDR * =  SPC030: =2C4F 3DF700 CMP AX,0F7H =2C52 7C11 2C65 JL SPC040 ; IF NOT CURSOR CONTROL KEY =2C54 3DFA00 CMP AX,0FAH =2C57 7F0C 2C65 JG SPC040  2BFE JE CDCNG030 =2BF7 FE065961 INC SFKEYFLG =2BFB 43 INC BX =2BFC EBF3 2BF1 JMPS CDCNG020 = CDCNG030: =2BFE 803E596100 CMP SFK ;* OUTPUT DL ; = 0 ERROR RETURN * = ;* = 255 NORMAL RETURN * = ;* AL = A ; IF NOT CURSOR CONTROL KEY CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 30 = ; = ; *** Following modification permits unshifted (by EYFLG,0 =2C03 7405 2C0A JE CDCNG040 =2C05 58 POP AX =2C06 B200 MOV DL,0 =2C08 EB23 2C2D JMPS CDCNGRET = ; = CDCNG0SCII CODE * = ;********************************************************************** = 0096 BSTOP EQU 96H ; BREAK-STOP KEY CODE = 009A CHOME EQU 9AH ctrl) cursor control keys = ; *** to be interpreted via the SPCTBL, rather than inline code in CSCNV2; = ; *** this permits user config via SPCTBL modification alone. = ; =2C59 F6065D61040: =2C0A 58 POP AX =2C0B BBF45D MOV BX,OFFSET SPCTBL ; BX = SPECIAL KEY TABLE ADDR =2C0E B102 MOV CL,2 ; POINTER COUNT =2C10 E8F100 2D04  ; CLEAR-HOME KEY CODE = 0098 KBTAB EQU 98H ; TAB KEY CODE = 00FC KBDEL EQU 0FCH ; DEL KEY = 00FF KBPRNT EQU 0FFH ; PRINT KEY CODE R1.133 3/10 = 2 test kbsw1,02h ; CTRL key down? =2C5E 7435 2C95 jz spc060 ; if not, is "ordinary" special key... = ; = ; *** RMG / NECIS *** 9-9-83 =  CALL KBTBLSRCH ; SPECIAL KEY TABLE SEARCH =2C13 80FA00 CMP DL,0 =2C16 7405 2C1D JE CDCNG050 ; IF NOT SPECIAL KEY =2C18 E81300 2C2E CALL SPCCNV  ; = 0001 FNCON EQU 01H ; KB SIGNALE (KBSW1) FNC = ON = 0002 CTLON EQU 02H ; CTRL = ON = 0040 SFTON EQU 40H ;  ; =2C60 E8CA00 2D2D CALL CDCNV2 ; CURSOR CONTROL KEY CONVERT =2C63 EB33 2C98 JMPS SPCRET = ; = SPC040: =2C65 3C9A CMP AL,CHOME =2C ; SPECIAL KEY CHECK AND CNVERT CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 29 =2C1B EB10 2C2D JMPS CDCNGRET = ; =  SHIFT = ON = ; = SPCCNV: =2C2E 3C96 CMP AL,BSTOP =2C30 751D 2C4F JNE SPC030 ; IF NOT BREAK-STOP KEY =2C32 F6065D6101 TE67 7515 2C7E JNE SPC050 ; IF NOT CLEAR-HOME KEY =2C69 F6065D6102 TEST KBSW1,CTLON =2C6E 7507 2C77 JNZ SPC045 ; IF CTRL = ON =2C70 F6065D6140 TEST KBSW1,SFTON  CDCNG050: =2C1D BB7A5E MOV BX,OFFSET ASCTBL ; BX = ASCII KEY TABLE ADDR =2C20 B108 MOV CL,8 ; POINTER COUNT =2C22 E8DF00 2D04 CALL KBTBLSRCH ; ASST KBSW1,FNCON =2C37 7400 2C39 JZ SPC010 ; IF FNC = OFF = ; (DELETE) *R1.131 '82 12/22 = ; =2C39 F6065D6102 SPC010: TEST KBSW1,CTLON =2C75 741E 2C95 JZ SPC060 ; IF SHIFT = OFF = SPC045: =2C77 E85B0F 3BD5 CALL CRTCLR ; CRT ALL CLEAR =2C7A B200 MOV DL,0 =2C7C EB1A 2C98 CII KEY TABLE SEARCH =2C25 80FA00 CMP DL,0 =2C28 7403 2C2D JE CDCNGRET ; IF ERROR KEY-IN =2C2A E86C00 2C99 CALL ASCCNV ; ASCII KEY CHECK AND CONVERT =  =2C3E 750B 2C4B JNZ SPC020 ; IF CTRL = ON =2C40 F6065D6140 TEST KBSW1,SFTON =2C45 7504 2C4B JNZ SPC020 ; IF SHIFT = ON (SHIFT=CTRL) =2C47 B013 MOV AL JMPS SPCRET =2C7E F6065D6140 SPC050: TEST KBSW1,SFTON ; =2C83 7410 2C95 JZ SPC060 ; IF UNSHIFT =2C85 3C98 CMP AL,KBTAB =2C87 7504 2C8D JNE SPC055 ; ; = CDCNGRET: =2C2D C3 RET = ; = ;********************************************************************** = ;* SPECIAL KEY,13H ; BREAK-STOP = CTL-S =2C49 EB4D 2C98 JMPS SPCRET =2C4B B003 SPC020: MOV AL,03H ; CTL+BREAK-STOP = CTL-C =2C4D EB49 2C98 JMPS SPCRET = ; = H  IF NOT TAB KEY =2C89 B01F MOV AL,1FH ; SHIFT+TAB =2C8B EB0B 2C98 JMPS SPCRET =2C8D 3CFC SPC055: CMP AL,KBDEL =2C8F 7504 2C95 JNE SPC060 ; IF NOT DEL KEIFT + CTRL + @ = NULL =2CB3 EB4E 2D03 JMPS ASCRET = ;---------------------------------------------------------------------- = ; CTRL+KEY PROC. =2CB5 3D3000 ASC010: CMP  ADD BX,CX =2CF8 8A07 MOV AL,BYTE PTR[BX] ; GET ASCII CONVERT CODE =2CFA 3C00 CMP AL,0 =2CFC 7505 2D03 JNE ASCRET ; IF NOT NOTHING CODE =2CFE EB01 Y =2C91 B07F MOV AL,7FH ; RUBOUT CODE SET =2C93 EB03 2C98 JMPS SPCRET = ; =2C95 43 SPC060: INC BX =2C96 8A07 MOV AL,BYTE PTR[BX] = AX,30H =2CB8 7C0C 2CC6 JL ASC020 =2CBA 3D3900 CMP AX,39H =2CBD 7F07 2CC6 JG ASC020 ; IF NOT 0 - 9 KEY = ; OUTPUT SPEED CONTROL PROC. =2CBF 2C 2D01 JMPS ASCERR = ; =2D00 5B ASC060: POP BX CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 32 =2D01 B200 ASCERR ; = SPCRET: =2C98 C3 RET = ;********************************************************************** = ;* ASCII KEY CHECK AND CONVERT 30 SUB AL,30H =2CC1 A2EC5D MOV SPDWK,AL =2CC4 EB3B 2D01 JMPS ASCERR = ;---------------*R1.107 '83 5/28 ------------------------------------------ = : MOV DL,0 ; ERROR RETURN CODE SET = ; = ASCRET: =2D03 C3 RET = ; = ;*********************************************** * = ;* INPUT AL ; KEY-IN DATA CODE * = ;* BX ; ASCII KEY CODE TABLE ADDR * = ;*  ; =2CC6 8A4702 ASC020: MOV AL,2[BX] ; =2CC9 3D4100 CMP AX,41H =2CCC 7C33 2D01 JL ASCERR =2CCE 3D5E00 CMP AX,5EH =2CD1 7F2E 2D01 JG*********************** = ;* KEY-IN DATA TABLE SERCH ROUTINE * = ;********************************************************************** = KBTBLSRCH: = OUTPUT DL ; = 0 ERROR RETURN * = ;* = 255 NORMAL RETURN * = ;* AL = ASCII CODE  ASCERR ; IF NOT A - Z KEY = ASC025: =2CD3 E85400 2D2A CALL KBCTRL ; CTRL + ASCII CARACTER KEY =2CD6 EB2B 2D03 JMPS ASCRET = ;-------2D04 803F00 CMP BYTE PTR[BX],00H =2D07 7408 2D11 JE KBTBLERR ; IF DATA END (ERROR) =2D09 3807 CMP BYTE PTR[BX],AL =2D0B 7408 2D15 JE KBTBLNML  * = ;********************************************************************** = ASCCNV: =2C99 F6065D6102 TEST KBSW1,CTLON =2C9E 7438 2CD8 JZ ASC030 ; I----------------------------------------------------------------- = ; =2CD8 8A0E5D61 ASC030: MOV CL,KBSW1 =2CDC 80E17F AND CL,7FH ; MASK CAPS LOCK =2CDF 53  ; IF DATA CODE MATCH =2D0D 03D9 ADD BX,CX ; TABLE ADDR UP =2D0F EBF3 2D04 JMPS KBTBLSRCH ; NEXT SEARCH = KBTBLERR: =2D11 B200 F CTRL KEY = OFF =2CA0 F6065D6140 TEST KBSW1,SFTON CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 31 =2CA5 740E 2CB5 JZ ASC010  PUSH BX ; SAVE ASCII TABLE ADDR =2CE0 BB605E MOV BX,OFFSET KBSW1TBL ; =2CE3 803FFF ASC040: CMP BYTE PTR[BX],0FFH =2CE6 7418 2D00 JE ASC060 ; IF E MOV DL,0 =2D13 EB02 2D17 JMPS KBTBLRET = KBTBLNML: =2D15 B2FF MOV DL,0FFH = KBTBLRET: =2D17 C3 RET = ;********* ; IF SHIFT KEY = OFF = ;---------------*R1.132 '83 2/17 ------------------------------------- =2CA7 3D5F00 CMP AX,5FH ; =2CAA 7427 2CD3 JE ASC025 ; IFRROR SIGNAL =2CE8 380F CMP BYTE PTR[BX],CL =2CEA 7404 2CF0 JE ASC050 ; IF MACTH SIGNAL =2CEC 43 INC BX =2CED 43 INC BX =2CEE EBF3 *********************************** = ;* RETURN BOOT * = ;******************************************** = KBBOOT: =2D18 FA CLI =2D19 B SHIFT + CTRL + _ =2CAC 3D3200 CMP AX,32H ; =2CAF 7550 2D01 JNE ASCERR ; IF SHIFT + CTRL + ASCII = ERROR =2CB1 B000 MOV AL,00H ; IF SH 2CE3 JMPS ASC040 =2CF0 43 ASC050: INC BX =2CF1 8A0F MOV CL,BYTE PTR[BX] =2CF3 5B POP BX =2CF4 2AED SUB CH,CH =2CF6 03D9 H 000 MOV AL,00H ; DISABLE GRAPHIC DISPLAY =2D1B E672 OUT 72H,AL =2D1D 2BC0 SUB AX,AX =2D1F 8EC0 MOV ES,AX =2D21 8ED0 ollowing section (non-CTRL keys handled directly in SPCCNV now) = ; *** RMG / NECIS *** 9-9-83 = ; = ;CDCNV2009: = ; CMP AL,0F7H = ; SCROLL SPEED CONSTANT = ; = FF00 BOOTSTAK EQU 0FF00H ; RETURN BOOT STACK =5DF0 ED1F BOOTOF DW 1FEDH ; RETURN BOOT OFFSET =5DF2 00FE BOOTSE DW 0 MOV SS,AX =2D23 BC00FF MOV SP,OFFSET BOOTSTAK =2D26 FF2EF05D JMPF DWORD PTR BOOTOF = ; = ;********************************************* = ; JNE CDCNV2010 ; IF NOT VERTICAL UP = ; MOV AL,0BH = ; JMPS CDCNV2040 = ;CDCNV2010: = ; CMP AL,0F8H = FE00H ; RETURN BOOT SEGMENT CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 35 = EJECT = ;************************************** ;* CTRL+KEY PROC. * = ;********************************************* = KBCTRL: =2D2A 2C40 SUB AL,40H ; CTRL+KEY CODE CONVERT =2D2C C3  ; JNE CDCNV2020 ; IF NOT LINE FEED = ; MOV AL,0AH = ; JMPS CDCNV2040 = ;CDCNV2020: = ; CMP AL,0F9H ******************************** = ;* SPECIAL KEY CONVERT TABLE FORMAT * = ;* 1ST BYTE , 2ND BYTE * = ;*  RET = ; = ;********************************************* = ;* DATA CODE CONVERTION ROUTINE 2 * = ;* (CURSOR POSITON CONVERT)  = ; JNE CDCNV2030 ; IF NOT FORM FEED = ; MOV AL,0CH = ; JMPS CDCNV2040 = ;CDCNV2030: = ; MOV AL, ORIGINAL CONVERT * = ;* CODE , CODE * = ;***************************************************************** * = ;********************************************* = CDCNV2: = ; = ; *** Delete next two instructions *** RMG / NECIS *** 9-9-83 = ; = 1DH = ; = ; *** End Deletion *** RMG / NECIS *** 9-9-83 = ; = CDCNV2040: =2D4B C3 RET = ;********************************* = 5DF4 SPCTBL EQU OFFSET $ =5DF4 1B1B DB 1BH,1BH ; ESC =5DF6 2020 DB 20H,20H ; (SP) =5DF8 6A2A DB 6AH,2AH  ; *** TEST KBSW1,02H ; CHECK CTL-KEY = ; *** JZ CDCNV2009 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 33 =2D2D 803E6F66***************** = ;* CONIN USE AREA * = ;********************************************* = DSEG $ =5DD8 00 KBREPFLG DB 0  ; * =5DFA 6B2B DB 6BH,2BH ; + =5DFC 6D2D DB 6DH,2DH ; - =5DFE 6E2E DB 6EH,2EH ; . =5E00 6F2F DB 00 CMP FLAGX,0 =2D32 7510 2D44 JNE CDCNV2006 =2D34 3CF7 CMP AL,0F7H ; CTL-VERTICAL UP =2D36 7505 2D3D JNE CDCNV2005 =2D38 E8390D 3A74 CALL ROLL ; KBREPEAT FLAG =5DD9 00 KBULFLG DB 0 ; KB UPPER /LOWER FLAG = ; =5DDA 00 CTRLPFLG DB 0 ; CONTROL P STATUS FLAG =5DDB 202020202020 PROFFMSG DB  6FH,2FH ; / =5E02 7030 DB 70H,30H ; TEN-YEY 0 =5E04 7131 DB 71H,31H ; 1 =5E06 7232 DB 72H,32H ; DOWN =2D3B EB07 2D44 JMPS CDCNV2006 = CDCNV2005: =2D3D 3CF8 CMP AL,0F8H ; CTL-LINE FEED =2D3F 7503 2D44 JNE CDCNV2006 =2D41 E8900C 39D4 CALL  ' ' 2020 =5DE3 0C2020202020 PRONMSG DB 0CH,' ' 2020 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 34 =5DEB 00 SVDATA 2 =5E08 7333 DB 73H,33H ; 3 =5E0A 7434 DB 74H,34H ; 4 =5E0C 7535 DB 75H,35H ; 5 =5E0E 7636  ROLLUP = CDCNV2006: =2D44 E84D0B 3894 CALL CSWRT =2D47 B200 MOV DL,00H =2D49 EB00 2D4B JMPS CDCNV2040 = ; = ; *** Delete f DB 00H ; SAVE CODE =5DEC 09 SPDWK DB 09H ; INPUT OF SCROLL SPEED =5DED 00 SPDSAV DB 00H ; SCROLL SPEED STATUS =5DEE 9001 SPDCNT DW 0190H I  DB 76H,36H ; 6 =5E10 7737 DB 77H,37H ; 7 =5E12 7838 DB 78H,38H ; 8 =5E14 7939 DB 79 ; BACK-SPACE CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 36 =5E4C 9E3F DB 9EH,3FH ; HELP *R1.132 '83 2/17 =5E4E F70B  DB 0FFH,0 ; END (ERROR) = ; = ;********************************************************************** = ;* ASCII KEY CODE CONVERT TABLE FORMAT H,39H ; 9 =5E16 8080 DB 80H,80H ; PF 1 =5E18 8181 DB 81H,81H ; PF 2 =5E1A 8282 DB 82H,82H ; PF  DB 0F7H,0BH ; (CURSOR UP) =5E50 F80A DB 0F8H,0AH ; (CURSOR DOWN) =5E52 F90C DB 0F9H,0CH ; --> =5E54 FA1D DB 0FA * = ;* BYTE ; * = ;* 0 ; ORIGINAL CODE * = ;* 1  3 =5E1C 8383 DB 83H,83H ; PF 4 =5E1E 8484 DB 84H,84H ; PF 5 =5E20 8585 DB 85H,85H ; PF 6 =5E22 8686 H,1DH ; <-- =5E56 FB1C DB 0FBH,1CH ; INS =5E58 FC18 DB 0FCH,18H ; DEL =5E5A FD0D DB 0FDH,0DH ; ENTER =5E5C FF10  ; NORMAL (UNSHIFT) / ALT (UNSHIFT) * = ;* 2 ; " (SHIFT) / ALT (SHIFT) *R1.107 * = ;* 3 ; GRPH1 (UNSHIFT) / ALT+GRPH1 (UNSHIFT) * =  DB 86H,86H ; PF 7 =5E24 8787 DB 87H,87H ; PF 8 =5E26 8888 DB 88H,88H ; PF 9 =5E28 8989 DB 89H,89H  DB 0FFH,10H ; PRINT =5E5E 0000 DB 0,0 ; DATA END (STOPER) = ; = ;*********************************************************** ;* 4 ; " (SHIFT) / " (SHIFT) * = ;* 5 ; GRPH2 (UNSHIFT) / ALT+GRPH2 (UNSHIFT) * = ;* 6 ; " (SHIFT) /  ; PF 10 =5E2A 8A8A DB 8AH,8AH ; PF 11 =5E2C 8B8B DB 8BH,8BH ; PF 12 =5E2E 8C8C DB 8CH,8CH ; PF 13 =5E30 8D8D *********** = ;* KB SIGNAL TABLE FORMAT * = ;********************************************************************** = 5E60 KBSW1TBL EQU O " (SHIFT) * = ;* 7 ; UNUSED *R1.107 '83 4/27 * = ;********************************************************************** = 5E7A ASCTBL EQU  DB 8DH,8DH ; PF 14 =5E32 8E8E DB 8EH,8EH ; PF 15 =5E34 8F8F DB 8FH,8FH ; PF 16 =5E36 9000 DB 90H,0FFSET $ =5E60 0001 DB 0,1 ; NORMAL =5E62 4002 DB 40H,2 ; NORMAL (SHIFT) =5E64 0403 DB 04H,3 ; GRPH1 (UNSHIFT) =5E66 4 OFFSET $ =5E7A 3131210190C7 DB 31H,31H,21H,01H,90H,0C7H,0A0H,21H ; ! 1 A021 =5E82 3232400291CC DB 32H,32H,40H,02H,91H,0CCH,0A2H,40H ; @ 2 A240 =5E8A 3333230392B1  ; PF 17 =5E38 9100 DB 91H,0 ; PF 18 =5E3A 9200 DB 92H,0 ; PF 19 =5E3C 9300 DB 93H,0 ; PF 20 =404 DB 44H,4 ; GRPH1 (SHIFT) =5E68 0805 DB 08H,5 ; GRPH2 (UNSHIFT) =5E6A 4806 DB 48H,6 ; GRPH2 (SHIFT) =5E6C 2001  DB 33H,33H,23H,03H,92H,0B1H,0A6H,23H ; # 3 A623 =5E92 3434240493B3 DB 34H,34H,24H,04H,93H,0B3H,0DBH,24H ; $ 4 DB24 =5E9A 3535250594B4 DB 35H,35H,25H,05H,94H,0B4H,0D3H,5E3E 9400 DB 94H,0 ; PF 21 =5E40 9500 DB 95H,0 ; PF 22 =5E42 9613 DB 96H,13H ; BREAK-STOP =5E44 970D  DB 20H,1 ; ALT (UNSHIFT) =5E6E 6002 DB 60H,2 ; ALT (SHIFT) =5E70 2403 DB 24H,3 ; ALT+GRPH1 (UNSHIFT) =5E72 6404 25H ; % 5 D325 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 37 =5EA2 3636D00695B5 DB 36H,36H,0D0H,06H,95H,0B5H,0CDH,9BH ; 6  DB 97H,0DH ; RETURN =5E46 9809 DB 98H,09H ; TAB =5E48 9A1E DB 9AH,1EH ; CLEAR-HOME =5E4A 9C08 DB 9CH,08H  DB 64H,4 ; ALT+GRPH1 (SHIFT) =5E74 2805 DB 28H,5 ; ALT+GRPH2 (UNSHIFT) =5E76 6806 DB 68H,6 ; ALT+GRPH2 (SHIFT) =5E78 FF00 I  CD9B =5EAA 3737260796D4 DB 37H,37H,26H,07H,96H,0D4H,0A5H,26H ; & 7 A526 =5EB2 38382A0897D5 DB 38H,38H,2AH,08H,97H,0D5H,0A3H,2AH ; * 8 A32A =5EBA 3939280998D6  ; =5F52 4161411BEBDE DB 41H,61H,41H,1BH,0EBH,0DEH,00H,41H ; A 0041 =5F5A 5373531CECDF DB 53H,73H,53H,1CH,0ECH,0DFH,0,53H ; S 0053 =5F62 4464441DEDC1 D DB 2FH,2FH,3FH,8FH,0FFH,0,0D9H,3FH ; ? / D93F = ; CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 39 =  DB 39H,39H,28H,09H,98H,0D6H,0ADH,28H ; ( 9 AD28 =5EC2 3030290A99DC DB 30H,30H,29H,0AH,99H,0DCH,0AEH,29H ; ) 0 AE29 =5ECA 5F2D5F0B9AA8 DB 5FH,2DH,5FH,0BH,9AH,0A8H,0CEH,5FB 44H,64H,44H,1DH,0EDH,0C1H,00H,44H ; D 0044 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 38 =5F6A 4666461EEEC4 DB 46H,66H,46H,1EH,0EE EJECT = ;********************************************************************** = ;* KEY BOARD INTERRUPT ROUTINE * = ;**************H ; _ - CE5F =5ED2 2D3D2B0C9BAF DB 2DH,3DH,2BH,0CH,9BH,0AFH,0ACH,2BH ; + = AC2B =5EDA 40607E0D9CB0 DB 40H,60H,7EH,0DH,9CH,0B0H,0C8H,7EH ; ~ ` C87E = H,0C4H,00H,46H ; F 0046 =5F72 4767471FEFBC DB 47H,67H,47H,1FH,0EFH,0BCH,00H,47H ; G 0047 =5F7A 48684880F0CA DB 48H,68H,48H,80H,0F0H,0CAH,00H,48H ; H 004******************************************************** = CSEG $ = INTKB: =2D4C E84B04 319A CALL REGSAVE = ; = ; GET DATA FROM K ; =5EE2 5171510E9DC0 DB 51H,71H,51H,0EH,9DH,0C0H,00H,51H ; Q 0051 =5EEA 5777570F9EC3 DB 57H,77H,57H,0FH,9EH,0C3H,00H,57H ; W 0057 =5EF2 456545109FB2 8 =5F82 4A6A4A81F1B7 DB 4AH,6AH,4AH,81H,0F1H,0B7H,00H,4AH ; J 004A =5F8A 4B6B4B82F2B8 DB 4BH,6BH,4BH,82H,0F2H,0B8H,00H,4BH ; K 004B =5F92 4C6C4C83F3CF DB 4B & SET IT TO FIFO BUFFER = ; = INTKB000: =2D4F E44A IN AL,KBSTP ; READ STATUS =2D51 A801 TEST AL,01H =2D53 7405 2D5A JZ INTKB00  DB 45H,65H,45H,10H,9FH,0B2H,00H,45H ; E 0045 =5EFA 52725211E0BD DB 52H,72H,52H,11H,0E0H,0BDH,00H,52H ; R 0052 =5F02 54745412E1B6 DB 54H,74H,54H,12H,0E1H,0B6H,00CH,6CH,4CH,83H,0F3H,0CFH,0,4CH ; L 004C =5F9A 3A3B3A84F4C9 DB 3AH,3BH,3AH,84H,0F4H,0C9H,00H,3AH ; : ; 003A =5FA2 3B272285F500 DB 3BH,27H,22H,85H,0F5H,0,0D2H,22H  =2D55 E448 IN AL,KBINP ; DUMMY GET =2D57 E9C700 2E21 JMP INTKB05 = INTKB00: = ;------------------------- R1.131 '82 12/24 ------------------------ =H,54H ; T 0054 =5F0A 59795913E2DD DB 59H,79H,59H,13H,0E2H,0DDH,00H,59H ; Y 0059 =5F12 55755514E3C5 DB 55H,75H,55H,14H,0E3H,0C5H,00H,55H ; U 0055 =5F1A  ; " ' D222 = ; =5FAA 5A7A5A86F6D8 DB 5AH,7AH,5AH,86H,0F6H,0D8H,00H,5AH ; Z 005A =5FB2 58785887F7DA DB 58H,78H,58H,87H,0F7H,0DAH,00H,58H ; X  ; = ; GENERATE CONTROL DATA = ; BIT = ; KBSW0 = 0 ; FNC = ; 1 ; CN49694915E4C6 DB 49H,69H,49H,15H,0E4H,0C6H,00H,49H ; I 0049 =5F22 4F6F4F16E5D7 DB 4FH,6FH,4FH,16H,0E5H,0D7H,00H,4FH ; O 004F =5F2A 50705017E6BE DB 50H,70H,500058 =5FBA 43634388F8B9 DB 43H,63H,43H,88H,0F8H,0B9H,00H,43H ; C 0043 =5FC2 56765689F9D1 DB 56H,76H,56H,89H,0F9H,0D1H,00H,56H ; V 0056 =5FCA 4262428AFABB DB TRL = ; 2 ; GRPH 1 = ; 3 ; GRPH 2 = ; 4 ; NOT USED = ; 5 H,17H,0E6H,0BEH,00H,50H ; P 0050 =5F32 5B5B7B18E700 DB 5BH,5BH,7BH,18H,0E7H,00H,0A7H,7BH ; [ A77B =5F3A 5D5D7D19E800 DB 5DH,5DH,7DH,19H,0E8H,00H,0A9H,7DH ; ] 42H,62H,42H,8AH,0FAH,0BBH,00H,42H ; B 0042 =5FD2 4E6E4E8BFBC2 DB 4EH,6EH,4EH,8BH,0FBH,0C2H,00H,4EH ; N 004E =5FDA 4D6D4D8CFCCB DB 4DH,6DH,4DH,8CH,0FCH,0CBH,00H,4DH  ; ALT = ; 6 ; SHIFT = ; 7 ; CAPS LOCK = ; = ; (1) CHECK SW SIGNAL = ; =2D A97D =5F42 5C5C7C1AE900 DB 5CH,5CH,7CH,1AH,0E9H,00H,0AAH,7CH ; AA7C =5F4A 5ECE5E00EA00 DB 5EH,0CEH,5EH,00H,0EAH,00H,0ABH,5EH ; ^ AB5E =  ; M 004D =5FE2 2C2C3C8DFDBF DB 2CH,2CH,3CH,8DH,0FDH,0BFH,0A4H,3CH ; < , A43C =5FEA 2E2E3E8EFEBA DB 2EH,2EH,3EH,8EH,0FEH,0BAH,0A1H,3EH ; > . A13E =5FF2 2F2F3F8FFF00J 5A E44C IN AL,KBSWP =2D5C 242F AND AL,2FH ; MASK NOT USED FLAG =2D5E A25C61 MOV KBSW0,AL = ; (2) CHECK SHIFT STATUS =  TEST KBSW0,FNCON ; CTRL KEY ON , FNC KEY ON ? =2D9F 7404 2DA5 JZ INTKB0044 ; OFF =2DA1 B102 MOV CL,02H ; CTRL + FNC + PRINT KEY =2DA3 EB0.A86 Customized Basic I/O System V1 PAGE 41 = ;-------------------------------------------------------------------- = ; = ; CHECK FIFO ; =2D61 E44E IN AL,KBSFP =2D63 A801 TEST AL,01H =2D65 7405 2D6C JZ INTKB003 ; IF NOT SHIFT =2D67 800E5C6140 OR KBSW0,40H ; SD 2DB2 JMPS INTKB0048 ; = GRAPH MEMORY DUMP = INTKB0044: =2DA5 B100 MOV CL,00H ; CTRL + PRINT KEY =2DA7 EB09 2DB2 JMPS INTKB0048  FULL = ; =2DE9 B100 MOV CL,0 =2DEB 803E16613E CMP KBIN,KBFIFOSZ-2 =2DF0 7407 2DF9 JE INTKB01 =2DF2 8A0E1661 MOV CL,KBIN =2DF6 80C102 HIFT = INTKB003: =2D6C A804 TEST AL,04H =2D6E 7405 2D75 JZ INTKB004 ; IF NOT CAPS =2D70 800E5C6180 OR KBSW0,80H ; CAPS LOCK = ; = CHARACTER DUMP = INTKB0046: =2DA9 F6065C6101 TEST KBSW0,FNCON ; CTRL KEY OFF , FNC KEY ON ? =2DAE 7407 2DB7 JZ INTKB005 ; NOT SCREEN DUMP MOD ADD CL,2 = INTKB01: =2DF9 3A0E1761 CMP CL,KBOUT ; FIFO FULL : = ; (KBIN+2) MOD 64 = KBOUT ? = ;  INTKB004: =2D75 E448 IN AL,KBINP ; GET KEY-IN DATA =2D77 A25861 MOV KBIND,AL = =2D7A 3C96 CMP AL,BSTOP ; =2D7C 7511 E =2DB0 B101 MOV CL,01H ; FNC + PRINT KEY = ; = CRT GRAPH DUMP = INTKB0048: =2DB2 E88400 2E39 CALL SCRD NEED BELL ALARM =2DFD 7422 2E21 JE INTKB05 ; YES =2DFF 803E5F6100 CMP CLICKFLG,0 =2E04 7403 2E09 JE INTKB04 ; KEY CLICK OFF =2E06 E86504 326E  2D8F JNE INTKB0042 ; IF NOT BREAK-STOP KEY R1.133 '83 3/10 =2D7E F6065C6101 TEST KBSW0,FNCON ; CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 UMP ; INTERRUPT SCREEN DUMP =2DB5 EB6A 2E21 JMPS INTKB05 ; = ;-------------------------------------------------------------------------- = = INTKB005: =2DB7 CALL KBCLICK ; YEY CLICK = ; = ; SET CONTROL AND INPUT DATA TO FIFO BUFFER = ; = INTKB04: =2E09 BB1861 MOV BX,OFFSET KB PAGE 40 =2D83 7432 2DB7 JZ INTKB005 ; IF NOT FNC ON =2D85 F6065C6102 TEST KBSW0,CTLON ; =2D8A 742B 2DB7 JZ INTKB005 ; IF NOT CTRL ON =  803E606100 CMP SYSKEYINFLG,0 ; DISABLE EXTERNAL INTERRUPT ??? =2DBC 7402 2DC0 JE INTKB006 ; IF ENABLE KEY BOARD INPUT =2DBE EB61 2E21 JMPS INTKB05 ; IF DFIFO =2E0C A01661 MOV AL,KBIN =2E0F 98 CBW =2E10 03D8 ADD BX,AX =2E12 A05C61 MOV AL,KBSW0 =2E15 8807 MOV BYTE PTR [BX],AL ; C ; = ; RETURN BOOT = ; =2D8C E889FF 2D18 CALL KBBOOT ; RETURN BOOT = = ;-------------- R1.133 '83 3/10 ----------------------ISABLE KEY BOARD INPUT = INTKB006: = ;---------------*R1.107 4/13/'83 ------------------------------------ =2DC0 F6065C6120 TEST KBSW0,20H =2DC5 740E 2DD5 JZ INTKB007 ONTROL DATA =2E17 43 INC BX =2E18 A05861 MOV AL,KBIND =2E1B 8807 MOV BYTE PTR [BX],AL = ; = ; MAINTENANCE KBIN POINTER = --------------------- = ; = ; CHECK SCREEN DUMP PROC. = ; = INTKB0042: =2D8F 3CFF CMP AL,KBPRNT ; PRINT KEY ? =2D91 7 ; IF NOT ALT KEY ON =2DC7 2E800E862504 OR ALTRBYTFLG,04H =2DCD 2EC606783989 MOV ALTRBYT,89H =2DD3 EB14 2DE9 JMPS INTKB008 = INTKB007: =2DD5 2E802686258B  ; =2E1D 880E1661 MOV KBIN,CL = ;------------------ R1.131 '82 12/24 ---------------------------------- = INTKB05: ; R1.133 3/10 =2E21 C606524 2DB7 JNE INTKB005 ; NON =2D93 F6065C6102 TEST KBSW0,CTLON ; CTRL KEY ON ? =2D98 740F 2DA9 JZ INTKB0046 ; OFF =2D9A F6065C6101  AND ALTRBYTFLG,8BH =2DDB 2EF606862503 TEST ALTRBYTFLG,03H =2DE1 7506 2DE9 JNZ INTKB008 =2DE3 2EC606783900 MOV ALTRBYT,0 = INTKB008: = CP/M ASM86 1.1 SOURCE: USCBIOSJ 826000 MOV KBREPDELAY,0 ; KB REPEAT DELAY TIME CLEAR =2E26 C606836000 MOV KBREPRATE,0 ; KB REPEAT RATE TIME CLEAR =2E2B C606D85D00 MOV KBREPFLG,0 ; KB REPEAT FL ; =2E4D 06 PUSH ES ; = ; =2E4E CDDD INT INTSDP = ; =2E50 07 POP ES ; =2E51 1F  2EC9 JZ INTTM03 ; IF REPEAT SIGNAL OFF = ; =2E92 803E826000 CMP KBREPDELAY,0 =2E97 7522 2EBB JNE INTTM02 = INTTM01: =2E99 803E836000 AG CLEAR = ;---------------------------------------------------------------------- = ; = ; RESTORE REGISTER = ; = ;-------------- R1.1 POP DS ; =2E52 C606856000 MOV GDCBUSYF,0 = ; =2E57 8A16DC64 MOV DL,CA ; =2E5B 8A36DB64 MOV DH,LA =2E5F E8940C 3AF6 CALL KBL CMP KBREPRATE,0 =2E9E 7508 2EA8 JNE INTTM011 =2EA0 A07E60 MOV AL,REPDELAY =2EA3 A28260 MOV KBREPDELAY,AL = ; SET 1 SEC33 3/10 DELETE ----------------------------------- =2E30 C606FD5F01 MOV INTKBFLG,1 ; IF KB INPUT SET ON = INTKB06: ; R1.133 3/10 =2E35 E8AB03 31E3 CALL CCV ; =2E62 E8E90C 3B4E CALL KBCSRO ; OUTPUT CURSOR AT CURRENT SCREEN ADR. = SCRDMPRET: =2E65 C3 RET = ;---------------------------------------------- DELAY COUNTER =2EA6 EB30 2ED8 JMPS INTTM04 = INTTM011: =2EA8 FE0E8360 DEC KBREPRATE ; COUNT DOWN KB REPEAT RATE COUNTER =2EAC 752A 2ED8 JNZ INTTM04 =2EAE C606D85D REGRESTORE = ; =2E38 CF IRET ; RETURN = ; = ;-------------- R1.133 '83 3/11 --------------------------------------- = ------------------------- CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 43 = EJECT = ;*****************************************01 MOV KBREPFLG,1 =2EB3 A07F60 MOV AL,REPRATE =2EB6 A28360 MOV KBREPRATE,AL =2EB9 EB1D 2ED8 JMPS INTTM04 = INTTM02: =  ;************************************************************************ CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 42 = ;* SCREEN DUMP ***************************** = ;* INTTM TIMER INTERRUPT ROUTINE * = ;********************************************************************** = INTTM:  ; COUNT DOWN KB REPEAT-DELAY COUNTER =2EBB FE0E8260 DEC KBREPDELAY =2EBF 7517 2ED8 JNZ INTTM04 =2EC1 A07F60 MOV AL,REPRATE =2EC4 A28360 MOV  * = ;* CL = 00H ; CHARACTER DUMP ( CTRL + PRINT) * = ;* = 01H ; CRT GRAPH DUMP ( FNC + PRINT) * =  =2E66 E89B03 3204 CALL REGSAVETM = ; RELOAD 25MS COUNTER =2E69 B004 MOV AL,04H =2E6B E646 OUT 46H,AL ; RESET TIMER INTERRUPT =2E6D 2AC0  KBREPRATE,AL =2EC7 EB0F 2ED8 JMPS INTTM04 = INTTM03: =2EC9 C606816000 MOV SYSTMCHK,0 =2ECE C606826000 MOV KBREPDELAY,0 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized B ;* = 02H ; GRAPH MEMORY DUMP ( CTRL + FNC + PRINT) * = ;************************************************************************ = ; = 00DD INTSDP EQU 2 SUB AL,AL =2E6F E629 OUT 29H,AL =2E71 B0F0 MOV AL,0F0H ; 25MS =2E73 E629 OUT 29H,AL =2E75 FE06FA5F INC INTTMEVEN =2E79 F606FA5F01 asic I/O System V1 PAGE 44 =2ED3 C606836000 MOV KBREPRATE,0 = INTTM04: =2ED8 A06161 MOV AL,SYSDSPFLG =2EDB 32066261 XOR AL21 ; INTERRUPTION SCREEN DUMP = ; = SCRDUMP: =2E39 803E856000 CMP GDCBUSYF,0 ; IF GDC BUSY =2E3E 7525 2E65 JNZ SCRDMPRET ; BUSY =2E40 803E6E6600  TEST INTTMEVEN,01H =2E7E 7403 2E83 JZ INTTM00 =2E80 E9BE00 2F41 JMP INTTMRET = INTTM00: = ; CHECK FIFO EMPTY & KB REPEAT ON =2E83 A01661 MO,SYSDSPFSAV =2EDF 7404 2EE5 JZ INTTM040 =2EE1 FE06FB5F INC DISPREQ = INTTM040: =2EE5 803E846000 CMP KBMODECHK,0 =2EEA 750B 2EF7 JNZ INTTM041 =2EEC  CMP DMAXFLG,0 ; IF DMAXER EXECUTE =2E45 751E 2E65 JNZ SCRDMPRET ; EXECUTE = ; =2E47 C606856001 MOV GDCBUSYF,1 =2E4C 1E PUSH DS V AL,KBIN =2E86 3A061761 CMP AL,KBOUT =2E8A 753D 2EC9 JNE INTTM03 ; IF KB FIFO IS NOT EMPTY =2E8C E44C IN AL,KBSWP =2E8E A810 TEST AL,10H =2E90 7437K E85600 2F45 CALL KBSTCHK =2EEF A08060 MOV AL,MODECHK =2EF2 A28460 MOV KBMODECHK,AL =2EF5 EB11 2F08 JMPS INTTM042 = INTTM041: =2EF7 FE0E8460 OS.A86 Customized Basic I/O System V1 PAGE 45 =2F4C C606FD5F00 MOV INTKBFLG,0 ; FLAG RESET =2F51 C606006000 MOV KBSFSAV,0 =2F56 E44E IN A1.107 '83 04/15 =2FBD 2EF606862503 TEST ALTRBYTFLG,03H ; *R1.107 '83 04/15 =2FC3 7506 2FCB JNZ KBSTCHK032 ; *R1.107 '83 04/15 =2FC5 2EC606783900 MOV A DEC KBMODECHK =2EFB 803E816000 CMP SYSTMCHK,0 =2F00 7406 2F08 JZ INTTM042 =2F02 FE0E8160 DEC SYSTMCHK ; COUNT DOWN =2F06 EB28 2F30 JMPS INTTM05 = L,KBSFP =2F58 A804 TEST AL,04H =2F5A 7504 2F60 JNZ KBSTCHK01 =2F5C FE060060 INC KBSFSAV = KBSTCHK01: =2F60 A00060 MOV AL,KBSFSAV =2F63 32060LTRBYT,0 ; *R1.107 '83 04/15 = KBSTCHK032: =2FCB E83800 3006 CALL KBATTOFF ; IF NOT ALT MODE = KBSTCHK04: =2FCE F606FE5F04 TEST KBSWSAV,04 INTTM042: =2F08 A07D60 MOV AL,TMCHK =2F0B A28160 MOV SYSTMCHK,AL =2F0E E8BE01 30CF CALL GETTIME ; GET TIME =2F11 A01360 MOV AL,SYSMIN =2F14160 XOR AL,KBSFSAV1 =2F67 741C 2F85 JZ KBSTCHK03 =2F69 FE06FC5F INC DISPREQKB =2F6D A00060 MOV AL,KBSFSAV =2F70 A20160 MOV KBSFSAV1,AL = H ; GRPH1 MODE CHECK =2FD3 7405 2FDA JZ KBSTCHK041 =2FD5 E82A00 3002 CALL KBATTON ; IF GRPH1 MODE =2FD8 EB03 2FDD JMPS KBSTCHK05 = KBSTCHK041: =2FDA E82900  803E116002 CMP SYSTMFLG,2 ; IF CLOCK REWRITED =2F19 7406 2F21 JE INTTM045 =2F1B 3A061760 CMP AL,OLDMIN =2F1F 740F 2F30 JE INTTM05 = ; CONVERT KBSTCHK02: =2F73 BB0260 MOV BX,KBSTBUF ; SET SCREEN MEMORY ADDRESS =2F76 803E006000 CMP KBSFSAV,0 =2F7B 7405 2F82 JE KBSTCHK021 =2F7D E88600 3006 CALL  3006 CALL KBATTOFF ; IF NOT GRPH1 MODE = KBSTCHK05: CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 46 =2FDD F606FE5F08 TEST TIME DATA & SET IT TO DISPLAY BUFFER = INTTM045: =2F21 C606116000 MOV SYSTMFLG,0 ; SYSTM FLAG RESET =2F26 A21760 MOV OLDMIN,AL =2F29 E8FB01 3127 CALL TIMESET =2F2C  KBATTOFF ; IF CAPS IS LOCKED =2F80 EB03 2F85 JMPS KBSTCHK03 = KBSTCHK021: =2F82 E87D00 3002 CALL KBATTON ; IF CAPS IS NOT LOCKED = KBSTCHK03: =2F85 E44C  KBSWSAV,08H ; GRPH2 MODE CHECK =2FE2 7405 2FE9 JZ KBSTCHK051 =2FE4 E81B00 3002 CALL KBATTON ; IF GRPH2 MODE =2FE7 EB03 2FEC JMPS KBSTCHK06 = KBSTCHK051: =2FFE06FB5F INC DISPREQ = ; = INTTM05: =2F30 803EFB5F00 CMP DISPREQ,0 =2F35 7507 2F3E JNE INTTM051 =2F37 803EFC5F00 CMP DISPREQKB,0 IN AL,KBSWP ; GET KB STATUS =2F87 242C AND AL,2CH =2F89 A2FE5F MOV KBSWSAV,AL =2F8C 3206FF5F XOR AL,KBSWSAV1 =2F90 745A 2FEC JZ KBSE9 E81A00 3006 CALL KBATTOFF ; IF NOT GRPH2 MODE = KBSTCHK06: =2FEC A0EC5D MOV AL,SPDWK =2FEF 3A06ED5D CMP AL,SPDSAV =2FF3 740C 3001 JE KBSTC =2F3C 7403 2F41 JE INTTMRET = INTTM051: =2F3E E8D100 3012 CALL DISPSTATUS = INTTMRET: =2F41 E80903 324D CALL REGRESTORETM =2F44 CF TCHK06 =2F92 FE06FC5F INC DISPREQKB =2F96 A0FE5F MOV AL,KBSWSAV =2F99 A2FF5F MOV KBSWSAV1,AL =2F9C BB0660 MOV BX,KBSTBUF+4 ; SET SCREEN MEMORY ADDRESS =2F9F FHKRET =2FF5 A2ED5D MOV SPDSAV,AL =2FF8 0C30 OR AL,30H =2FFA A24D60 MOV STATUSSP,AL =2FFD FE06FB5F INC DISPREQ = KBSTCHKRET: =3001 C3  IRET = ; = ;********************************************************************** = ;* KB STATUS CHECK ROUTINE * = ;606FE5F20 TEST KBSWSAV,20H ; ALT MODE CHECK =2FA4 7411 2FB7 JZ KBSTCHK031 =2FA6 2E800E862504 OR ALTRBYTFLG,04H ; SET ALT_KEY BIT *R1.107 '83 04/13 =2FAC 2EC606783989 MOV  RET = ; = KBATTON: =3002 B090 MOV AL,90H ; ATTRIBUTE DEFAULT =3004 EB02 3008 JMPS KBATSET = KBATTOFF: =3006 B0********************************************************************** = KBSTCHK: =2F45 803EFD5F00 CMP INTKBFLG,0 ; IF KEY IN =2F4A 7439 2F85 JE KBSTCHK03 CP/M ASM86 1.1 SOURCE: USCBI ALTRBYT,89H =2FB2 E84D00 3002 CALL KBATTON ; IF ALT MODE =2FB5 EB17 2FCE JMPS KBSTCHK04 = KBSTCHK031: =2FB7 2E802686250B AND ALTRBYTFLG,0BH ; RESET ALT_KEY BIT *RK 80 MOV AL,80H ; ATTRIBUTE REVERSE = KBATSET: =3008 B90300 MOV CX,3 = KBATSET1: =300B 8807 MOV [BX],AL ; SET ATTRIBUTE  3822 CALL CURSOROFF ; DISABLE CURSOR DISPLAY =3055 E8FC0B 3C54 CALL KBCSAD ; CURRENT CURSOR ADR. --*R1.133 '83 03/18-- =3058 50 PUSH AX =3059 803EFB5F00 CMP DIS DB 03H =30B9 2042 DW 4220H =30BB 00 KBATBYT DB 00H =30BC 40 DB 40H =30BD 00 DB 00H CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/DATA =300D 43 INC BX =300E E2FB 300B LOOP KBATSET1 =3010 43 INC BX =3011 C3 RET = ;**************************************************PREQ,0 =305E 7436 3096 JE DISPSTATUS04 =3060 C606FB5F00 MOV DISPREQ,0 ; CLEAR DISPLAY REQUEST FLAG =3065 B80000 MOV AX,0 ; CURSOR POSITION SET TO HOME LINE =3068 E8E30A O System V1 PAGE 48 =30BE 40 DB 40H =30BF 43 INC BX =30C0 E2EC 30AE LOOP DISPSTATUS05 = DISPSTATUS06: = ******************** = ;* DISPSTATUS DISPLAY SYSTEM STATUS LINE * = ;********************************************************************** = DISPSTATUS: =30 3B4E CALL KBCSRO =306B B95000 MOV CX,COLUMN =306E 803E616100 CMP SYSDSPFLG,0 =3073 740B 3080 JE DISPSTATUS02 =3075 49 DEC CX =3076 E8AE0B 3C2 ;***** =30C2 58 POP AX = ;***** =30C3 E8880A 3B4E CALL KBCSRO =30C6 2E8F06CE3B POP CRTDSP ; RESTORE CURSOR DISP PARAMETER --*R1.133 '83 03/10-12 803E856000 CMP GDCBUSYF,0 ; =3017 7403 301C JE DISPSTATUS000 ; IF GDC READY =3019 E9B200 30CE JMP DISPSTATUSRET ; IF GDC BUSY = DISPSTATUS000: =301C 803E6E6600 7 CALL KBCRTC0 ; ERASE STATUS LINE =3079 C606FE5FFF MOV KBSWSAV,0FFH =307E EB42 30C2 JMPS DISPSTATUS06 = DISPSTATUS02: =3080 BB1860 MOV BX,OFFSET STAT- =30CB E8E90A 3BB7 CALL KBCSRD ; OUTPUT CURSOR DISP COMMAND = DISPSTATUSRET: =30CE C3 RET = ; = ;************************************** CMP DMAXFLG,0 ; DMA EXECUTE FLAG =3021 7403 3026 JE DISPSTATUS00 ; IF NOT DMA EXECUTE =3023 E9A800 30CE JMP DISPSTATUSRET = DISPSTATUS00: =3026 803E626100 USLINE = DISPSTATUS03: =3083 8A07 MOV AL,[BX] = ; DISPLAY STATUS LINE =3085 2EA29130 MOV STDTBYT,AL =3089 E8070B 3B93 CALL KBMOUT =308C 03 ******************************** = ;* GET TIME ROUTINE * = ;********************************************************************** = GETT CMP SYSDSPFSAV,0 =302B 7415 3042 JE DISPSTATUS002 =302D 803E616100 CMP SYSDSPFLG,0 =3032 7403 3037 JE DISPSTATUS001 ; SYSDSPFLG 1 -> 1 =3034 E99700 30CE JMP DI DB 03H =308D 2042 DW 4220H =308F 00 STALTBYT DB 00H =3090 40 DB 40H =3091 00 STDTBYT DB 00H =3092 40 DB 4IME: =30CF 803E116001 CMP SYSTMFLG,01 ; =30D4 7450 3126 JE GETTMRET ; WRITING CLOCK NOW = GETTM01: =30D6 55 PUSH BP =30D7 BB1260 MOV SPSTATUSRET = DISPSTATUS001: =3037 C606626100 MOV SYSDSPFSAV,0 ; 1 -> 0 =303C FE06FC5F INC DISPREQKB =3040 EB0B 304D JMPS DISPSTATUS01 = 0H =3093 43 INC BX =3094 E2ED 3083 LOOP DISPSTATUS03 = DISPSTATUS04: =3096 803EFC5F00 CMP DISPREQKB,0 =309B 7425 30C2 JE DISPSTATUS06 =309D C6 BX,OFFSET SYSTM ; BX = SYSTM BUFFER ADDRESS =30DA F9 STC =30DB BE0200 MOV SI,2 ; SI = COUNTER (CNT0) =30DE BA5800 MOV DX,0058H ; DX = I/O PORT# =30E1 B003  DISPSTATUS002: CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 47 =3042 803E616100 CMP SYSDSPFLG,0 =3047 7404 304D JE DISPSTATUS01 ; SY06FC5F00 MOV DISPREQKB,0 =30A2 B90F00 MOV CX,KBSTBUFSZ =30A5 BB0260 MOV BX,KBSTBUF =30A8 B81F10 MOV AX,STATUSKB_AD ; SCREEN ADDRESS FOR KB STATUS =30AB E8A MOV AL,03H ; =30E3 E8FC13 44E2 CALL PSCLKS ; TIME READ =30E6 B001 MOV AL,01H ; =30E8 E8FF13 44EA CALL PSCLKE ; REGISTER SHIFT =30EB 50 SDSPFLG 0 -> 0 =3049 FE066261 INC SYSDSPFSAV ; 0 -> 1 = DISPSTATUS01: =304D 2EFF36CE3B PUSH CRTDSP ; SAVE CURSOR DISP PARAM --*R1.133 '83 03/10-- =3052 E8CD07 00A 3B4E CALL KBCSRO = DISPSTATUS05: =30AE 8A17 MOV DL,[BX] =30B0 2E8816BB30 MOV KBATBYT,DL =30B5 E8DB0A 3B93 CALL KBMOUT =30B8 03 L  PUSH AX =30EC EC IN AL,DX ; AL = LSB (SEC.) =30ED D0E8 SHR AL,1 ; CF = READ DATA (1BIT) =30EF D1DD RCR BP,1 ; BP = READ 1) =311E E9D8FF 30F9 JMP GETTM021 = GETTM022: =3121 8BC5 MOV AX,BP =3123 8827 MOV [BX],AH ; =3125 5D POP BP = T STATUSWK =3161 B90300 MOV CX,3 =3164 F3A4 REP MOVS AL,AL = ; DAY =3166 A01560 MOV AL,SYSDAY =3169 E81F00 318B CALL GETNIBBLE =316C 0D3030 DATA (STORED) =30F1 58 POP AX =30F2 B10F MOV CL,15 ; CL = COUNTER (CNT1) =30F4 E90200 30F9 JMP GETTM021 = GETTM02: =30F7 B110 MO GETTMRET: =3126 C3 RET ; RETURN = ; = ;********************************************************************** = ;* TIMESET CONVE OR AX,3030H =316F A35D60 MOV STATUSDD,AX = ; HOUR =3172 A01460 MOV AL,SYSHOUR =3175 E81300 318B CALL GETNIBBLE =3178 0D3030 V CL,16 ; CL = COUNTER (CNT1) = GETTM021: =30F9 0C10 OR AL,10H =30FB EE OUT DX,AL ; CLK = 1 =30FC 56 PUSH SI ; WAIRT TIME DATA TO ASCII * = ;********************************************************************** = TIMESET: =3127 1E PUSH DS =3128 B800A0  OR AX,3030H =317B A36360 MOV STATUSHH,AX = ; MINUTES =317E A01360 MOV AL,SYSMIN =3181 E80700 318B CALL GETNIBBLE =3184 0D3030 OR AX,303T = 5 (MICRO SEC.) =30FD 5E POP SI =30FE 56 PUSH SI =30FF 5E POP SI =3100 50 PUSH AX =3101 EC IN AL,DX ; REMOV AX,0A000H ; =312B 8ED8 MOV DS,AX ; DS = C_MOS SEGMENT =312D BB0001 MOV BX,0100H ; BX = YY ADDRESS =3130 8B07 MOV AX,[BX] ; GET YY FROM C_MOS 0H =3187 A36660 MOV STATUSMIN,AX =318A C3 RET = ;********************************************************************** = ;* GETNIBBLE AD DATA (1BIT) =3102 D0E8 SHR AL,1 ; AL = READ DATA (1BIT) =3104 D1DD RCR BP,1 ; BP = READ DATA (STORED) =3106 58 POP AX =3107 24EF  =3132 1F POP DS =3133 A36060 MOV STATUSYY,AX ; SET YY STATUS LINE BUFFER =3136 A01660 MOV AL,SYSMM =3139 E84F00 318B CALL GETNIBBLE =313C 50  * = ;* INPUT AL ; 'B7--B4,B3--B0' * = ;* OUTPUT AH ; '0000 ,B3--B0' * = ;* AND AL,0EFH ; =3109 EE OUT DX,AL ; CLK = 0 CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 49 =310A 56 PUSH  PUSH AX =313D B430 MOV AH,30H ; CONVERT HEX TO ASCII =313F 3C0A CMP AL,10 =3141 7204 3147 JB TIMESET01 =3143 2C0A SUB AL,10 =3145 B431  AL ; '0000 ,B7--B4' * = ;********************************************************************** = GETNIBBLE: =318B 51 PUSH CX =318C 8AC8  SI ; WAIT = 5 (MICRO SEC.) =310B 5E POP SI =310C 56 PUSH SI =310D 5E POP SI =310E 90 NOP =310F E2E8 30F9 LOOP GETT MOV AH,31H = TIMESET01: =3147 0C30 OR AL,30H =3149 86E0 XCHG AH,AL =314B A35A60 MOV STATUSMM,AX =314E 58 POP  MOV CL,AL =318E 240F AND AL,0FH =3190 8AE0 MOV AH,AL =3192 8AC1 MOV AL,CL =3194 B104D2E8 MOV CL,4 ! SHR AL,CL =3198 59 M021 ; JUMP IF CNT1 NE 0 =3111 4E DEC SI ; DEC. SI =3112 780D 3121 JS GETTM022 ; SET READ DATA =3114 892F MOV [BX],BP ; =3116 43  AX = ; GET DAY OF WEEK =314F 8AC4 MOV AL,AH =3151 250F00 AND AX,0FH =3154 B90300 MOV CX,3 =3157 F7E1 MUL CX =3159 BE6860  POP CX =3199 C3 RET CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 51 = EJECT = ;**** INC BX =3117 43 INC BX =3118 0BF6 OR SI,SI =311A 75DB 30F7 JNZ GETTM02 ; JUMP IF CNT1 NE 0 =311C B108 MOV CL,8 ; CL = COUNTER (CNT MOV SI,OFFSET WEEK CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 50 =315C 03F0 ADD SI,AX =315E BF5460 MOV DI,OFFSEL ****************************************************************** = ; DATA AREA FOR TIMER = ;********************************************************************** = DSEG  ; 123456789012345678901234567890 =6018 202020202020 STATUSLINE DB ' ' 202020202020 202020202020 202020202020 2020 =6032 2020202020 HDMRK DB  ;* REGISTER SAVE ROUTINE * = ;********************************************************************** = CSEG $ = REGSAVE: $ =5FFA 00 INTTMEVEN DB 0 ; INTTM COUNTER =5FFB 01 DISPREQ DB 1 ; REQUEST TO DISPLAY STATUS LINE =5FFC 01 DISPREQKB DB 1 ; REQUEST TO DISPLAY KB MODE =5 ' ' =6037 43415020414C STATUSKB DB 'CAP ALT GR1 GR2 ' 542047523120 475232202020 20 =604A 73703A DB 'sp:' =604D 392020202020 STATUSSP DB '9',' '  =319A 2EA38660 MOV CS:RS_AX,AX =319E 58 POP AX =319F 2EA38860 MOV CS:RS_RTN,AX =31A3 2E89268A60 MOV CS:RS_SP,SP =31A8 2E8C168C60 MOV CS:RS_SS,SFFD 00 INTKBFLG DB 0 ; REQUEST KEY-IN FLAG =5FFE 00 KBSWSAV DB 0 ; KB STATUS SAVED =5FFF FF KBSWSAV1 DB 0FFH ; =6000 00 KBSFSAV DB  20 =6054 20202020 STATUSWK DB ' ' =6058 2020 DB ' ' =605A 2020 STATUSMM DW ' ' CP/M ASM86 1.1 SOURCE: USCBIOS.A86 Customized Basic I/O System V1 S =31AD BCCE60 MOV SP,CS:OFFSET INTSTACKBASE =31B0 8CC8 MOV AX,CS =31B2 8ED0 MOV SS,AX =31B4 2EA18660 MOV AX,CS:RS_AX =31B8 061E PUSH ES 0 ; CAPS STATUS SAVED =6001 01 KBSFSAV1 DB 1 ; = 101F STATUSKB_AD EQU 101FH = 000F KBSTBUFSZ EQU 15 ; = 6002 KBSTBUF EQU OFF PAGE 52 =605C 2F DB '/' =605D 2020 STATUSDD DW ' ' =605F 2F DB '/' =6060 2020 STATUSYY DW ' ' =606 ! PUSH DS =31BA 5053 PUSH AX ! PUSH BX =31BC 5152 PUSH CX ! PUSH DX =31BE 5556 PUSH BP ! PUSH SI =31C0 57 PUSH DI =31C1 2E8E068C60 MOV ES,CS:RS_SSET $ ; KB MODE ATTRIBUTE BUFFER =6002 8080808080 DB 80H,80H,80H,80H,80H =6007 8080808080 DB 80H,80H,80H,80H,80H =600C 8080808080 DB 80H,80H,80H,80H,80H = 2 20 DB ' ' =6063 2020 STATUSHH DW ' ' =6065 3A DB ':' =6066 2020 STATUSMIN DW ' ' =6068 53756E4D6F6E WEEK DB S ; *R1.103 '82 8/25 =31C6 2E8B1E8A60 MOV BX,CS:RS_SP =31CB 268B4704 MOV AX,ES:04[BX] =31CF 250002 AND AX,0200H =31D2 7401 31D5 JZ REGSAVE1 =31D4 FB  ; = ; SYSTEM TIME = ; =6011 00 SYSTMFLG DB 0 ; 0 = NOT CARE CLOCK = ; 1 = WRITING CLOCK NOW =  'SunMonTueWedThuFriSat' 547565576564 546875467269 536174 =607D 64 TMCHK DB 100 ; SYSTEM-TIMER CHECK =10 S =607E 0A REPDELAY DB 10 ; REPEAT--DELAY TIME =500MS =607F  STI = REGSAVE1: =31D5 8CC8 MOV AX,CS =31D7 8ED8 MOV DS,AX =31D9 8EC0 MOV ES,AX =31DB A18660 MOV AX,RS_AX =31DE FC  ; 2 = REWRITE CLOCK = 6012 SYSTM EQU $ =6012 00 SYSSEC DB 0 ; SEC BCD =6013 00 SYSMIN DB 0 ; MIN 01 REPRATE DB 1 ; REPEAT--RATE = 50MS =6080 05 MODECHK DB 5 ; KB MODE CHECK =500MS =6081 00 SYSTMCHK DB 0 =6082 00 KBREPDELAY D CLD =31DF FF268860 JMP RS_RTN ; RETURN WITHOUT POP STACK = ;********************************************************************** = ;* REGISTER RESTORE ROUTI BCD =6014 00 SYSHOUR DB 0 ; HOUR BCD =6015 00 SYSDAY DB 0 ; DAY BCD =6016 00 SYSMM DB 0 ; MM/DAB 0 =6083 00 KBREPRATE DB 0 =6084 00 KBMODECHK DB 0 = ; =6085 00 GDCBUSYF DB 0 ; GDC BUSY FLAG = ; CP/M ASM86 1.1 NE * = ;********************************************************************** = REGRESTORE: =31E3 FA CLI =31E4 58 POP AXY OF WEEK HEX/HEX = ; =6017 FF OLDMIN DB 0FFH ; SAVE LAST MINUTES ----*R1.131 '83/01/31---- = ; = ; SYSTEM STATUS LINE BUFFER = SOURCE: USCBIOS.A86 Customized Basic I/O System V1 PAGE 53 = EJECT = ;********************************************************************** =