.ORG 0x7600 BIOS: .AREA: EQU $ .CONADR: .DS 2 ; 7600 .CONPOS: .EQU $ ; 7602 .CONHOR: .DS 1 .CONVER: .DS 1 .CONESC: .DS 1 ; 7604 .LASTKEY: .DS 1 ; 7605 .RUSLAT: .DS 1 ; 7606 .RSRV1: .DS 2 ; 7607 .SCANKEY: .DS 2 ; 7609 .SCANFLAG: .DS 1 ; 760B .RSRV2: .DS 1 ; 760C .TEMPSP: .DS 2 ; 760D .RSRV3: .DS 1 ; 760F .RSRV4: .DS 16+6 ; .JUMP: .DS 1 ; 7626 .PARAMETERS: ..HL: .DS 2 ; 7627 ..DE: .DS 2 ; 7629 ..BC: .DS 2 ; 762B ..SECOND: .DS 1 ; 762D .TAPE: ..PHASE: .DS 1 ; 762E ..SPEED: .DS 2 ; 762F .MEMTOP: .DS 2 ; 7631 .CONBUF: .DS 30 ; 7633 .AREA.END: .EQU 0x765F .STACK: .EQU 0x76CF .PUTEXT: .EQU 0xF922 .VIDEO: .EQU 0xFACE I8255: .MAIN: .EQU 0x8000 ..PA: .EQU 0x8000 ..PB: .EQU 0x8001 ..PC: .EQU 0x8002 ..MODE: .EQU 0x8003 .SLAVE: .EQU 0xA000 ..PA: .EQU 0xA000 ..PB: .EQU 0xA001 ..PC: .EQU 0xA002 ..MODE: .EQU 0xA003 I8275: .EQU 0xC000 .DATA: .EQU 0xC000 .MODE: .EQU 0xC001 I8257: .EQU 0xE000 .ADDR0: .EQU 0xE000 .SIZE0: .EQU 0xE001 .ADDR1: .EQU 0xE002 .SIZE1: .EQU 0xE003 .ADDR2: .EQU 0xE004 .SIZE2: .EQU 0xE005 .ADDR3: .EQU 0xE006 .SIZE3: .EQU 0xE007 .MODE: .EQU 0xE008 ..STOP: .EQU 0x80 MONITOR:.EQU 0xF800 .VIDEO: .EQU 0xF82D .EXIT: .EQU 0xF86C CONST: .BEEP: .EQU 0x1234 .SLEEP 1 .RUN 0 .ORG 0xF800 .MODEL I8080 BIOS: .START: JMP MONITOR .MEMTOP:EQU 0x7631 .GETKEY:JMP MONITOR.GETKEY .GETAPE:JMP MONITOR.GETAPE .PUTCHR:JMP MONITOR.PUTCHR .PUTAPE:JMP MONITOR.PUTAPE .PUTASC:JMP MONITOR.PUTASC .CHEKEY:JMP MONITOR.CHEKEY .PUTHEX:JMP MONITOR.PUTHEX .PUTEXT:JMP MONITOR.PUTEXT .INKEY: JMP MONITOR.INKEY .GETCUR:JMP MONITOR.GETCUR .GETSCR:JMP MONITOR.GETSCR .GETBLK:JMP MONITOR.GETBLK .PUTBLK:JMP MONITOR.PUTBLK .CALCRC:JMP MONITOR.CALCRC .SETSCR:JMP MONITOR.SETSCR .GETMEM:LHLD BIOS.MEMTOP .SETMEM:SHLD BIOS.MEMTOP RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MONITOR: .COLD: MVI A,0x8A STA I8255.MAIN.MODE LXI SP,BIOS.STACK CALL .VIDEO LXI HL,BIOS.AREA MOV D,H MVI E,BIOS.AREA.END MOV C,L CALL .DIRECTIVE.FILL LXI HL,BIOS.STACK SHLD BIOS.MEMTOP LXI HL,.MSG.LOGO CALL .PUTEXT CALL .VIDEO LXI HL,0x75FF SHLD BIOS.MEMTOP LXI HL,0x1D2A SHLD BIOS.TAPE.SPEED MVI A,0xC3 STA BIOS.JUMP .WARM: LXI SP,BIOS.STACK LXI HL,.MSG.PROMPT CALL .PUTEXT STA I8255.MAIN.PC DCR A STA I8255.SLAVE.PC CALL .INPUT LXI HL,.WARM PUSH HL LXI HL,BIOS.CONBUF MOV A,M CPI 0x58 JZ .DIRECTIVE_X CPI 0x55 JZ .DIRECTIVE_U .ORG 0xF922 .PUTEXT:MOV A,M ORA A RZ CALL BIOS.PUTCHAR JMP .PUTEXT PUSH "TEST\0" POP HL .ORG 0 START: MVI A,I8257.MODE.STOP STA I8257.MODE LXI BC,CONST.BEEP CALL BEEP CALL .BEEP CALL MONITOR.VIDEO JMP MONITOR.EXIT .ORG 0xFD27 @BEEP: MOV A,C ; Временная глобальная метка. .LOOP: EI ; Локальная метка. DCR A JNZ .LOOP MOV A,C .LOOP: DI ; Переопределение локальной метки. DCR A JNZ .LOOP DCR B JNZ BEEP .BEEP: RET ; Локальная метка. .MODEL I8080 LXI HL,0x1234 SHLD 0x4321 LHLD 0x1234 INR H INR L INX HL MOV M,A MVI M,0xE6 ADC M .MODEL X86 MOV BX,0x1234 MOV [0x4321],BX MOV BX,[0x1234] INC BH INC BL INC BX MOV [BX],AL MOV [BX],0xE6 ADC AL,[BX]
00_000_000`C NOP ``` 00_XX0_001`D LXI BC?|DE?|HL?|SP,IW ``` 00_0X0_010`F STAX BC?|DE? ``` 00_XXX_100`F INR|INC B|C|D|E|H|L|M|A ``` 00_XX0_011`D INX|INC BC?|DE?|HL?|SP ``` 00_XX0_101`F DCR|DEC B|C|D|E|H|L|M|A ``` 00_XX0_110`F MVI|MOV B|C|D|E|H|L|M|A,IB ``` 00_100_010`F SHLD IW ``` 00_101_010`F LHLD IW ``` 00_110_010`F STA IW ``` 00_111_010`F LDA IW ``` 01_110_110`C HLT ``` 01_XXX_YYY`F MOV B|C|D|E|H|L|M|A,B|C|D|E|H|L|M|A ``` 10_000_XXX`A ADD B|C|D|E|H|L|M|A ``` 10_001_XXX`A ADC B|C|D|E|H|L|M|A ``` 10_010_XXX`A SUB B|C|D|E|H|L|M|A ``` 10_011_XXX`A SBB B|C|D|E|H|L|M|A ``` 10_100_XXX`A ANA|AND B|C|D|E|H|L|M|A ``` 10_101_XXX`A XRA|XOR B|C|D|E|H|L|M|A ``` 10_110_XXX`A ORA|OR B|C|D|E|H|L|M|A ``` 10_111_XXX`A CMP B|C|D|E|H|L|M|A ```